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