1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use uuid::Uuid;
6
7#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "lowercase")]
50pub enum BillingCycle {
51 Monthly,
52 Yearly,
53 Custom,
54}
55
56#[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#[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#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
139#[serde(rename_all = "lowercase")]
140pub enum MemberStatus {
141 Active,
142 Invited,
143 Suspended,
144 Removed,
145}
146
147#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
200#[serde(rename_all = "camelCase")]
201pub struct UpdateMemberRoleRequest {
202 pub role: MemberRole,
203}
204
205#[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#[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}