Skip to main content

systemprompt_models/api/cloud/
tenant.rs

1//! Cloud tenant, plan, and subscription DTOs exchanged between the CLI and the
2//! cloud API.
3
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum SubscriptionStatus {
10    Active,
11    Trialing,
12    PastDue,
13    Paused,
14    Canceled,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct CloudPlanInfo {
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub id: Option<String>,
21    pub name: String,
22    pub memory_mb: i32,
23    pub volume_gb: i32,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
27pub struct CloudPlan {
28    pub id: String,
29    pub name: String,
30    pub paddle_price_id: systemprompt_identifiers::PriceId,
31    #[serde(default)]
32    pub memory_mb_default: i32,
33    #[serde(default)]
34    pub volume_gb: i32,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub max_tenants: Option<i32>,
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(rename_all = "snake_case")]
41pub enum CloudTenantStatus {
42    Pending,
43    Active,
44    Suspended,
45    Deleted,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct CloudTenantInfo {
50    pub id: String,
51    pub name: String,
52    #[serde(default, skip_serializing_if = "Option::is_none")]
53    pub subscription_id: Option<String>,
54    #[serde(default, skip_serializing_if = "Option::is_none")]
55    pub subscription_status: Option<SubscriptionStatus>,
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub app_id: Option<String>,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub hostname: Option<String>,
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub region: Option<String>,
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub status: Option<CloudTenantStatus>,
64    #[serde(default, skip_serializing_if = "Option::is_none")]
65    pub plan: Option<CloudPlanInfo>,
66    #[serde(default)]
67    pub external_db_access: bool,
68    pub database_url: String,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
72pub struct CloudTenant {
73    pub id: String,
74    pub name: String,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub fly_app_name: Option<String>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub fly_hostname: Option<String>,
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub hostname: Option<String>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
84pub struct CloudTenantStatusResponse {
85    pub status: String,
86    #[serde(default, skip_serializing_if = "Option::is_none")]
87    pub message: Option<String>,
88    #[serde(default, skip_serializing_if = "Option::is_none")]
89    pub app_url: Option<String>,
90    #[serde(default, skip_serializing_if = "Option::is_none")]
91    pub secrets_url: Option<String>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct CloudTenantSecrets {
96    pub database_url: String,
97    pub internal_database_url: String,
98    pub app_url: String,
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub anthropic_api_key: Option<String>,
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub openai_api_key: Option<String>,
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub gemini_api_key: Option<String>,
105}
106
107#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
108pub struct SetExternalDbAccessRequest {
109    pub enabled: bool,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct ExternalDbAccessResponse {
114    pub tenant_id: systemprompt_identifiers::TenantId,
115    pub external_db_access: bool,
116    pub database_url: String,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct RotateCredentialsResponse {
121    pub status: String,
122    pub message: String,
123    pub internal_database_url: String,
124    pub external_database_url: String,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct CloudEnterpriseLicenseInfo {
129    pub id: String,
130    pub name: String,
131    pub domain: String,
132    #[serde(default, skip_serializing_if = "Option::is_none")]
133    pub plan: Option<CloudPlanInfo>,
134}