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};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum SubscriptionStatus {
13    Active,
14    Trialing,
15    PastDue,
16    Paused,
17    Canceled,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct CloudPlanInfo {
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub id: Option<String>,
24    pub name: String,
25    pub memory_mb: i32,
26    pub volume_gb: i32,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
30pub struct CloudPlan {
31    pub id: String,
32    pub name: String,
33    pub paddle_price_id: systemprompt_identifiers::PriceId,
34    #[serde(default)]
35    pub memory_mb_default: i32,
36    #[serde(default)]
37    pub volume_gb: i32,
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub max_tenants: Option<i32>,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
43#[serde(rename_all = "snake_case")]
44pub enum CloudTenantStatus {
45    Pending,
46    Active,
47    Suspended,
48    Deleted,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct CloudTenantInfo {
53    pub id: String,
54    pub name: String,
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub subscription_id: Option<String>,
57    #[serde(default, skip_serializing_if = "Option::is_none")]
58    pub subscription_status: Option<SubscriptionStatus>,
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub app_id: Option<String>,
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub hostname: Option<String>,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub region: Option<String>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub status: Option<CloudTenantStatus>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub plan: Option<CloudPlanInfo>,
69    #[serde(default)]
70    pub external_db_access: bool,
71    pub database_url: String,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
75pub struct CloudTenant {
76    pub id: String,
77    pub name: String,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub fly_app_name: Option<String>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub fly_hostname: Option<String>,
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub hostname: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
87pub struct CloudTenantStatusResponse {
88    pub status: String,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub message: Option<String>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub app_url: Option<String>,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub secrets_url: Option<String>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct CloudTenantSecrets {
99    pub database_url: String,
100    pub internal_database_url: String,
101    pub app_url: 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 CloudEnterpriseLicenseInfo {
132    pub id: String,
133    pub name: String,
134    pub domain: String,
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub plan: Option<CloudPlanInfo>,
137}