systemprompt_models/api/cloud/
tenant.rs1use 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}