1use std::collections::HashMap;
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7use uuid::Uuid;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct Workspace {
13 pub id: Uuid,
14 pub organization_id: Uuid,
15 pub name: String,
16 pub description: Option<String>,
17 pub target: String,
18 pub snapshot: String,
19 pub user: String,
20 pub env: HashMap<String, String>,
21 pub cpu: u32,
22 pub gpu: u32,
23 pub memory: u32,
24 pub disk: u32,
25 pub public: bool,
26 pub network_block_all: bool,
27 pub network_allow_list: Option<Vec<String>>,
28 pub labels: HashMap<String, String>,
29 pub volumes: Vec<WorkspaceVolume>,
30 pub state: WorkspaceState,
31 pub desired_state: WorkspaceState,
32 pub error_reason: Option<String>,
33 pub backup_state: BackupState,
34 pub auto_stop_interval: u32,
35 pub auto_archive_interval: u32,
36 pub auto_delete_interval: i32,
37 pub class: String,
38 pub created_at: DateTime<Utc>,
39 pub updated_at: DateTime<Utc>,
40 pub runner_domain: Option<String>,
41 pub daemon_version: Option<String>,
42 pub git_repository: Option<GitRepository>,
43 pub ports: Option<Vec<PortMapping>>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "lowercase")]
49pub enum WorkspaceState {
50 Started,
51 Stopped,
52 Starting,
53 Stopping,
54 Archived,
55 Archiving, Restoring,
57 Destroying,
58 Destroyed,
59 Error,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
64#[serde(rename_all = "PascalCase")]
65pub enum BackupState {
66 None,
67 Pending,
68 InProgress,
69 Completed,
70 Failed,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct WorkspaceVolume {
77 pub name: String,
78 pub path: String,
79 pub size: u32,
80 pub persistent: bool,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(rename_all = "camelCase")]
86pub struct GitRepository {
87 pub url: String,
88 pub branch: String,
89 pub commit: Option<String>,
90 pub ssh_key: Option<String>,
91 pub auth_token: Option<String>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase")]
97pub struct PortMapping {
98 pub port: u16,
99 pub target_port: u16,
100 pub protocol: PortProtocol,
101 pub public: bool,
102 pub description: Option<String>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all = "lowercase")]
108pub enum PortProtocol {
109 Tcp,
110 Udp,
111 Http,
112 Https,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct CreateWorkspaceParams {
119 pub name: String,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub description: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub target: Option<String>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub snapshot: Option<String>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub git_repository: Option<GitRepository>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub env: Option<HashMap<String, String>>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub cpu: Option<u32>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub memory: Option<u32>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub disk: Option<u32>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub ports: Option<Vec<PortMapping>>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub labels: Option<HashMap<String, String>>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub class: Option<String>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148#[serde(rename_all = "camelCase")]
149pub struct UpdateWorkspaceParams {
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub name: Option<String>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub description: Option<String>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub env: Option<HashMap<String, String>>,
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub labels: Option<HashMap<String, String>>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub auto_stop_interval: Option<u32>,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub auto_archive_interval: Option<u32>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub auto_delete_interval: Option<i32>,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct WorkspaceBackup {
170 pub id: Uuid,
171 pub workspace_id: Uuid,
172 pub name: String,
173 pub description: Option<String>,
174 pub size: u64,
175 pub created_at: DateTime<Utc>,
176 pub expires_at: Option<DateTime<Utc>>,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
181#[serde(rename_all = "camelCase")]
182pub struct PortPreview {
183 pub port: u16,
184 pub url: String,
185 pub public: bool,
186 pub expires_at: Option<DateTime<Utc>>,
187}