Skip to main content

daytona_client/models/
organization.rs

1//! Organization management models
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7/// Organization details
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct Organization {
11    pub id: Uuid,
12    pub name: String,
13    pub slug: String,
14    pub description: Option<String>,
15    pub website: Option<String>,
16    pub created_at: DateTime<Utc>,
17    pub updated_at: DateTime<Utc>,
18    pub owner_id: Uuid,
19    pub plan: OrganizationPlan,
20    pub quotas: OrganizationQuotas,
21    pub usage: OrganizationUsage,
22    pub settings: OrganizationSettings,
23}
24
25/// Organization plan
26#[derive(Debug, Clone, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct OrganizationPlan {
29    pub name: String,
30    pub tier: PlanTier,
31    pub price_monthly: f64,
32    pub billing_cycle: BillingCycle,
33    pub next_billing_date: DateTime<Utc>,
34}
35
36/// Plan tier
37#[derive(Debug, Clone, Serialize, Deserialize)]
38#[serde(rename_all = "lowercase")]
39pub enum PlanTier {
40    Free,
41    Starter,
42    Pro,
43    Enterprise,
44    Custom,
45}
46
47/// Billing cycle
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "lowercase")]
50pub enum BillingCycle {
51    Monthly,
52    Yearly,
53    Custom,
54}
55
56/// Organization quotas
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(rename_all = "camelCase")]
59pub struct OrganizationQuotas {
60    pub max_users: u32,
61    pub max_sandboxes: u32,
62    pub max_workspaces: u32,
63    pub max_storage_gb: u32,
64    pub max_cpu_cores: u32,
65    pub max_memory_gb: u32,
66    pub max_gpu_units: u32,
67    pub max_bandwidth_gb: u32,
68}
69
70/// Organization usage
71#[derive(Debug, Clone, Serialize, Deserialize)]
72#[serde(rename_all = "camelCase")]
73pub struct OrganizationUsage {
74    pub users: u32,
75    pub sandboxes: u32,
76    pub workspaces: u32,
77    pub storage_gb: f64,
78    pub cpu_core_hours: f64,
79    pub memory_gb_hours: f64,
80    pub gpu_unit_hours: f64,
81    pub bandwidth_gb: f64,
82    pub period_start: DateTime<Utc>,
83    pub period_end: DateTime<Utc>,
84}
85
86/// Organization settings
87#[derive(Debug, Clone, Serialize, Deserialize)]
88#[serde(rename_all = "camelCase")]
89pub struct OrganizationSettings {
90    pub allow_public_workspaces: bool,
91    pub require_2fa: bool,
92    pub allowed_domains: Vec<String>,
93    pub default_workspace_class: String,
94    pub default_sandbox_class: String,
95    pub auto_delete_inactive_days: Option<u32>,
96    pub network_restrictions: NetworkRestrictions,
97}
98
99/// Network restrictions
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct NetworkRestrictions {
103    pub allow_internet: bool,
104    pub allowed_ips: Vec<String>,
105    pub blocked_ips: Vec<String>,
106    pub allowed_domains: Vec<String>,
107    pub blocked_domains: Vec<String>,
108}
109
110/// Organization member
111#[derive(Debug, Clone, Serialize, Deserialize)]
112#[serde(rename_all = "camelCase")]
113pub struct OrganizationMember {
114    pub id: Uuid,
115    pub user_id: Uuid,
116    pub organization_id: Uuid,
117    pub email: String,
118    pub name: String,
119    pub role: MemberRole,
120    pub status: MemberStatus,
121    pub joined_at: DateTime<Utc>,
122    pub last_active_at: Option<DateTime<Utc>>,
123    pub two_factor_enabled: bool,
124}
125
126/// Member role
127#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "lowercase")]
129pub enum MemberRole {
130    Owner,
131    Admin,
132    Member,
133    Viewer,
134    Guest,
135}
136
137/// Member status
138#[derive(Debug, Clone, Serialize, Deserialize)]
139#[serde(rename_all = "lowercase")]
140pub enum MemberStatus {
141    Active,
142    Invited,
143    Suspended,
144    Removed,
145}
146
147/// Organization invitation
148#[derive(Debug, Clone, Serialize, Deserialize)]
149#[serde(rename_all = "camelCase")]
150pub struct OrganizationInvitation {
151    pub id: Uuid,
152    pub organization_id: Uuid,
153    pub email: String,
154    pub role: MemberRole,
155    pub invited_by: Uuid,
156    pub invited_at: DateTime<Utc>,
157    pub expires_at: DateTime<Utc>,
158    pub accepted_at: Option<DateTime<Utc>>,
159    pub token: String,
160}
161
162/// Create organization request
163#[derive(Debug, Clone, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase")]
165pub struct CreateOrganizationRequest {
166    pub name: String,
167    pub slug: String,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub description: Option<String>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub website: Option<String>,
172}
173
174/// Update organization request
175#[derive(Debug, Clone, Serialize, Deserialize)]
176#[serde(rename_all = "camelCase")]
177pub struct UpdateOrganizationRequest {
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub name: Option<String>,
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub description: Option<String>,
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub website: Option<String>,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub settings: Option<OrganizationSettings>,
186}
187
188/// Invite member request
189#[derive(Debug, Clone, Serialize, Deserialize)]
190#[serde(rename_all = "camelCase")]
191pub struct InviteMemberRequest {
192    pub email: String,
193    pub role: MemberRole,
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub message: Option<String>,
196}
197
198/// Update member role request
199#[derive(Debug, Clone, Serialize, Deserialize)]
200#[serde(rename_all = "camelCase")]
201pub struct UpdateMemberRoleRequest {
202    pub role: MemberRole,
203}
204
205/// API key
206#[derive(Debug, Clone, Serialize, Deserialize)]
207#[serde(rename_all = "camelCase")]
208pub struct ApiKey {
209    pub id: Uuid,
210    pub name: String,
211    pub key: String,
212    pub organization_id: Uuid,
213    pub created_by: Uuid,
214    pub created_at: DateTime<Utc>,
215    pub last_used_at: Option<DateTime<Utc>>,
216    pub expires_at: Option<DateTime<Utc>>,
217    pub scopes: Vec<String>,
218}
219
220/// Create API key request
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct CreateApiKeyRequest {
224    pub name: String,
225    #[serde(skip_serializing_if = "Option::is_none")]
226    pub expires_in_days: Option<u32>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub scopes: Option<Vec<String>>,
229}