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 jwt_secret: String,
97    pub database_url: String,
98    pub internal_database_url: String,
99    pub app_url: String,
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub sync_token: Option<String>,
102    #[serde(default, skip_serializing_if = "Option::is_none")]
103    pub anthropic_api_key: Option<String>,
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub openai_api_key: Option<String>,
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub gemini_api_key: Option<String>,
108}
109
110#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
111pub struct SetExternalDbAccessRequest {
112    pub enabled: bool,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct ExternalDbAccessResponse {
117    pub tenant_id: systemprompt_identifiers::TenantId,
118    pub external_db_access: bool,
119    pub database_url: String,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct RotateCredentialsResponse {
124    pub status: String,
125    pub message: String,
126    pub internal_database_url: String,
127    pub external_database_url: String,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct RotateSyncTokenResponse {
132    pub sync_token: String,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct CloudEnterpriseLicenseInfo {
137    pub id: String,
138    pub name: String,
139    pub domain: String,
140    #[serde(default, skip_serializing_if = "Option::is_none")]
141    pub plan: Option<CloudPlanInfo>,
142}