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