Skip to main content

systemprompt_cli/commands/cloud/
types.rs

1//! Serializable output DTOs for the `cloud` command group.
2//!
3//! Each type is the structured payload a cloud subcommand returns (status,
4//! login, tenant list/detail/create, secrets, deploy, sync, and related), used
5//! for both human rendering and `--json` output.
6//!
7//! Copyright (c) systemprompt.io — Business Source License 1.1.
8//! See <https://systemprompt.io> for licensing details.
9
10use chrono::{DateTime, Utc};
11use schemars::JsonSchema;
12use serde::{Deserialize, Serialize};
13
14pub use systemprompt_models::profile::ProfileInfo;
15
16#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
17pub struct CredentialsInfo {
18    pub authenticated: bool,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub user_email: Option<String>,
21    pub token_expired: bool,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
25pub struct TenantStatusInfo {
26    pub id: String,
27    pub name: String,
28    pub status: String,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub url: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub message: Option<String>,
33    pub configured_in_profile: bool,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
37pub struct CloudStatusOutput {
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub profile: Option<ProfileInfo>,
40    pub credentials: CredentialsInfo,
41    pub tenants: Vec<TenantStatusInfo>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
45pub struct TenantPlanInfo {
46    pub name: String,
47    pub memory_mb: i32,
48    pub volume_gb: i32,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
52pub struct LoginTenantInfo {
53    pub id: String,
54    pub name: String,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub subscription_status: Option<String>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub plan: Option<TenantPlanInfo>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub region: Option<String>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub hostname: Option<String>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
66pub struct LoginUserInfo {
67    pub id: String,
68    pub email: String,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub name: Option<String>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
74pub struct LoginCustomerInfo {
75    pub id: String,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
79pub struct LoginOutput {
80    pub user: LoginUserInfo,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub customer: Option<LoginCustomerInfo>,
83    pub tenants: Vec<LoginTenantInfo>,
84    pub credentials_path: String,
85    pub tenants_path: String,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
89pub struct WhoamiOutput {
90    pub user_email: String,
91    pub api_url: String,
92    pub token_status: String,
93    pub authenticated_at: DateTime<Utc>,
94    pub local_profiles: usize,
95    pub cloud_tenants: usize,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
99pub struct LogoutOutput {
100    pub message: String,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub credentials_path: Option<String>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
106pub struct TenantSummary {
107    pub id: String,
108    pub name: String,
109    pub tenant_type: String,
110    pub has_database: bool,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
114pub struct TenantListOutput {
115    pub tenants: Vec<TenantSummary>,
116    pub total: usize,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
120pub struct TenantDetailOutput {
121    pub id: String,
122    pub name: String,
123    pub tenant_type: String,
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub app_id: Option<String>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub hostname: Option<String>,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub region: Option<String>,
130    pub has_database: bool,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
134pub struct RotateCredentialsOutput {
135    #[serde(rename = "tenant_id")]
136    pub tenant: String,
137    pub status: String,
138    pub internal_database_url: String,
139    pub external_database_url: String,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
143pub struct ProfileSummary {
144    pub name: String,
145    pub has_secrets: bool,
146    pub is_active: bool,
147}
148
149#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
150pub struct ProfileListOutput {
151    pub profiles: Vec<ProfileSummary>,
152    pub total: usize,
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub active_profile: Option<String>,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
158pub struct SecretsOutput {
159    pub operation: String,
160    pub keys: Vec<String>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub rejected_keys: Option<Vec<String>>,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
166pub struct RestartOutput {
167    pub tenant_name: String,
168    pub status: String,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
172pub struct DockerfileOutput {
173    pub content: String,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
177pub struct CancelSubscriptionOutput {
178    #[serde(rename = "tenant_id")]
179    pub tenant: String,
180    pub tenant_name: String,
181    pub message: String,
182}