1use super::types::IsolationLevel;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(tag = "cmd", rename_all = "snake_case")]
7pub enum Command {
8 Auth {
9 database: String,
10 username: String,
11 password: String,
12 #[serde(default, skip_serializing_if = "Option::is_none")]
13 api_key: Option<String>,
14 },
15 Ping,
16 ListDatabases,
17 CreateDatabase {
18 name: String,
19 },
20 DeleteDatabase {
21 name: String,
22 },
23 ListCollections {
24 database: String,
25 },
26 CreateCollection {
27 database: String,
28 name: String,
29 #[serde(rename = "type")]
30 collection_type: Option<String>,
31 },
32 DeleteCollection {
33 database: String,
34 name: String,
35 },
36 CollectionStats {
37 database: String,
38 name: String,
39 },
40 Get {
41 database: String,
42 collection: String,
43 key: String,
44 },
45 Insert {
46 database: String,
47 collection: String,
48 key: Option<String>,
49 document: Value,
50 },
51 Update {
52 database: String,
53 collection: String,
54 key: String,
55 document: Value,
56 #[serde(default)]
57 merge: bool,
58 },
59 Delete {
60 database: String,
61 collection: String,
62 key: String,
63 },
64 List {
65 database: String,
66 collection: String,
67 limit: Option<usize>,
68 offset: Option<usize>,
69 },
70 Query {
71 database: String,
72 sdbql: String,
73 bind_vars: Option<std::collections::HashMap<String, Value>>,
74 },
75 Explain {
76 database: String,
77 sdbql: String,
78 bind_vars: Option<std::collections::HashMap<String, Value>>,
79 },
80 CreateIndex {
81 database: String,
82 collection: String,
83 name: String,
84 fields: Vec<String>,
85 #[serde(default)]
86 unique: bool,
87 #[serde(default)]
88 sparse: bool,
89 },
90 DeleteIndex {
91 database: String,
92 collection: String,
93 name: String,
94 },
95 ListIndexes {
96 database: String,
97 collection: String,
98 },
99 BeginTransaction {
100 database: String,
101 #[serde(default)]
102 isolation_level: IsolationLevel,
103 },
104 CommitTransaction {
105 tx_id: String,
106 },
107 RollbackTransaction {
108 tx_id: String,
109 },
110 TransactionCommand {
111 tx_id: String,
112 command: Box<Command>,
113 },
114 Batch {
115 commands: Vec<Command>,
116 },
117 BulkInsert {
118 database: String,
119 collection: String,
120 documents: Vec<Value>,
121 },
122 CreateScript {
123 database: String,
124 name: String,
125 path: String,
126 #[serde(default)]
127 methods: Vec<String>,
128 code: String,
129 description: Option<String>,
130 collection: Option<String>,
131 },
132 ListScripts {
133 database: String,
134 },
135 GetScript {
136 database: String,
137 script_id: String,
138 },
139 UpdateScript {
140 database: String,
141 script_id: String,
142 name: Option<String>,
143 path: Option<String>,
144 methods: Option<Vec<String>>,
145 code: Option<String>,
146 description: Option<String>,
147 },
148 DeleteScript {
149 database: String,
150 script_id: String,
151 },
152 GetScriptStats,
153 ListQueues {
154 database: String,
155 },
156 ListJobs {
157 database: String,
158 queue_name: String,
159 status: Option<String>,
160 limit: Option<usize>,
161 offset: Option<usize>,
162 },
163 EnqueueJob {
164 database: String,
165 queue_name: String,
166 script_path: String,
167 params: Option<Value>,
168 priority: Option<i32>,
169 run_at: Option<i64>,
170 max_retries: Option<u32>,
171 },
172 CancelJob {
173 database: String,
174 job_id: String,
175 },
176 ListCronJobs {
177 database: String,
178 },
179 CreateCronJob {
180 database: String,
181 name: String,
182 cron_expression: String,
183 script_path: String,
184 params: Option<Value>,
185 queue: Option<String>,
186 priority: Option<i32>,
187 max_retries: Option<u32>,
188 },
189 UpdateCronJob {
190 database: String,
191 cron_id: String,
192 name: Option<String>,
193 cron_expression: Option<String>,
194 script_path: Option<String>,
195 params: Option<Value>,
196 queue: Option<String>,
197 priority: Option<i32>,
198 max_retries: Option<u32>,
199 },
200 DeleteCronJob {
201 database: String,
202 cron_id: String,
203 },
204 ListTriggers {
205 database: String,
206 },
207 ListCollectionTriggers {
208 database: String,
209 collection: String,
210 },
211 CreateTrigger {
212 database: String,
213 name: String,
214 collection: String,
215 events: Vec<String>,
216 script_path: String,
217 filter: Option<String>,
218 queue: Option<String>,
219 priority: Option<i32>,
220 max_retries: Option<u32>,
221 #[serde(default = "default_true")]
222 enabled: bool,
223 },
224 GetTrigger {
225 database: String,
226 trigger_id: String,
227 },
228 UpdateTrigger {
229 database: String,
230 trigger_id: String,
231 name: Option<String>,
232 events: Option<Vec<String>>,
233 script_path: Option<String>,
234 filter: Option<String>,
235 queue: Option<String>,
236 priority: Option<i32>,
237 max_retries: Option<u32>,
238 enabled: Option<bool>,
239 },
240 DeleteTrigger {
241 database: String,
242 trigger_id: String,
243 },
244 ToggleTrigger {
245 database: String,
246 trigger_id: String,
247 },
248 ListEnvVars {
249 database: String,
250 },
251 SetEnvVar {
252 database: String,
253 key: String,
254 value: String,
255 },
256 DeleteEnvVar {
257 database: String,
258 key: String,
259 },
260 ListRoles,
261 CreateRole {
262 name: String,
263 permissions: Vec<String>,
264 },
265 GetRole {
266 name: String,
267 },
268 UpdateRole {
269 name: String,
270 permissions: Vec<String>,
271 },
272 DeleteRole {
273 name: String,
274 },
275 ListUsers,
276 CreateUser {
277 username: String,
278 password: String,
279 #[serde(default)]
280 roles: Vec<String>,
281 },
282 DeleteUser {
283 username: String,
284 },
285 GetUserRoles {
286 username: String,
287 },
288 AssignRole {
289 username: String,
290 role: String,
291 database: Option<String>,
292 },
293 RevokeRole {
294 username: String,
295 role: String,
296 },
297 GetCurrentUserPermissions,
298 GetCurrentUser,
299 ListApiKeys,
300 CreateApiKey {
301 name: String,
302 #[serde(default)]
303 permissions: Vec<String>,
304 expires_at: Option<i64>,
305 },
306 DeleteApiKey {
307 key_id: String,
308 },
309 ClusterStatus,
310 ClusterInfo,
311 ClusterRemoveNode {
312 node_id: String,
313 },
314 ClusterRebalance,
315 ClusterCleanup,
316 ClusterReshard {
317 database: String,
318 shards: u32,
319 },
320 TruncateCollection {
321 database: String,
322 collection: String,
323 },
324 CompactCollection {
325 database: String,
326 collection: String,
327 },
328 PruneCollection {
329 database: String,
330 collection: String,
331 },
332 RecountCollection {
333 database: String,
334 collection: String,
335 },
336 RepairCollection {
337 database: String,
338 collection: String,
339 },
340 GetCollectionSharding {
341 database: String,
342 collection: String,
343 },
344 ExportCollection {
345 database: String,
346 collection: String,
347 },
348 ImportCollection {
349 database: String,
350 collection: String,
351 documents: Vec<Value>,
352 },
353 SetCollectionSchema {
354 database: String,
355 collection: String,
356 schema: Value,
357 },
358 GetCollectionSchema {
359 database: String,
360 collection: String,
361 },
362 DeleteCollectionSchema {
363 database: String,
364 collection: String,
365 },
366 RebuildIndexes {
367 database: String,
368 collection: String,
369 },
370 HybridSearch {
371 database: String,
372 collection: String,
373 query: String,
374 vector: Vec<f32>,
375 limit: Option<u32>,
376 filter: Option<String>,
377 },
378 CreateGeoIndex {
379 database: String,
380 collection: String,
381 name: String,
382 field: String,
383 },
384 ListGeoIndexes {
385 database: String,
386 collection: String,
387 },
388 DeleteGeoIndex {
389 database: String,
390 collection: String,
391 name: String,
392 },
393 GeoNear {
394 database: String,
395 collection: String,
396 field: String,
397 latitude: f64,
398 longitude: f64,
399 radius: Option<f64>,
400 limit: Option<i32>,
401 },
402 GeoWithin {
403 database: String,
404 collection: String,
405 field: String,
406 polygon: Vec<(f64, f64)>,
407 },
408 CreateVectorIndex {
409 database: String,
410 collection: String,
411 name: String,
412 field: String,
413 dimensions: i32,
414 metric: Option<String>,
415 ef_construction: Option<i32>,
416 m: Option<i32>,
417 },
418 ListVectorIndexes {
419 database: String,
420 collection: String,
421 },
422 DeleteVectorIndex {
423 database: String,
424 collection: String,
425 name: String,
426 },
427 VectorSearch {
428 database: String,
429 collection: String,
430 index_name: String,
431 vector: Vec<f32>,
432 limit: Option<i32>,
433 ef_search: Option<i32>,
434 filter: Option<String>,
435 },
436 QuantizeVectorIndex {
437 database: String,
438 collection: String,
439 index_name: String,
440 },
441 DequantizeVectorIndex {
442 database: String,
443 collection: String,
444 index_name: String,
445 },
446 CreateTtlIndex {
447 database: String,
448 collection: String,
449 name: String,
450 field: String,
451 expire_after_seconds: i64,
452 },
453 ListTtlIndexes {
454 database: String,
455 collection: String,
456 },
457 DeleteTtlIndex {
458 database: String,
459 collection: String,
460 name: String,
461 },
462 CreateColumnar {
463 database: String,
464 name: String,
465 columns: Vec<Value>,
466 },
467 ListColumnar {
468 database: String,
469 },
470 GetColumnar {
471 database: String,
472 collection: String,
473 },
474 DeleteColumnar {
475 database: String,
476 collection: String,
477 },
478 InsertColumnar {
479 database: String,
480 collection: String,
481 rows: Vec<Value>,
482 },
483 AggregateColumnar {
484 database: String,
485 collection: String,
486 aggregations: Vec<Value>,
487 group_by: Option<Vec<String>>,
488 filter: Option<String>,
489 },
490 QueryColumnar {
491 database: String,
492 collection: String,
493 columns: Option<Vec<String>>,
494 filter: Option<String>,
495 order_by: Option<String>,
496 limit: Option<i32>,
497 },
498 CreateColumnarIndex {
499 database: String,
500 collection: String,
501 column: String,
502 },
503 ListColumnarIndexes {
504 database: String,
505 collection: String,
506 },
507 DeleteColumnarIndex {
508 database: String,
509 collection: String,
510 column: String,
511 },
512}
513
514fn default_true() -> bool {
515 true
516}