Skip to main content

k2db_api_contract/
dto.rs

1// SPDX-FileCopyrightText: 2026 Alexander R. Croft
2// SPDX-License-Identifier: GPL-3.0-only
3
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct HealthOk {
9    pub status: String,
10}
11
12#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13pub struct ReadyOk {
14    pub status: String,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct ReadyNotOk {
19    pub status: String,
20    pub databases: Vec<String>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub struct CreateResult {
25    pub id: String,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
29pub struct UpdateResult {
30    pub updated: u64,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct RestoreResult {
35    pub status: String,
36    pub modified: u64,
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
40pub struct CountResult {
41    pub count: u64,
42}
43
44#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
45pub struct MessageResponse {
46    pub message: String,
47}
48
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
50pub struct SearchRequest {
51    #[serde(default)]
52    pub filter: Value,
53    pub params: Option<Value>,
54    pub skip: Option<u64>,
55    pub limit: Option<u64>,
56}
57
58#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
59pub struct AggregateRequest {
60    pub criteria: Vec<Value>,
61    pub skip: Option<u64>,
62    pub limit: Option<u64>,
63}
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
66pub struct CountRequest {
67    pub criteria: Option<Value>,
68}
69
70#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
71pub struct PatchCollectionRequest {
72    pub criteria: Value,
73    pub values: Value,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
77pub struct RestoreRequest {
78    pub criteria: Value,
79}
80
81#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
82pub struct VersionedUpdateRequest {
83    pub data: Value,
84    pub replace: Option<bool>,
85    #[serde(rename = "maxVersions")]
86    pub max_versions: Option<u64>,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
90pub struct VersionedUpdateResult {
91    pub updated: u64,
92    #[serde(rename = "versionSaved")]
93    pub version_saved: u64,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
97pub struct VersionInfo {
98    #[serde(rename = "_uuid")]
99    pub uuid: String,
100    #[serde(rename = "_v")]
101    pub version: u64,
102    #[serde(rename = "_at")]
103    pub at: u64,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107pub struct CreateIndexesRequest {
108    #[serde(rename = "indexSpec")]
109    pub index_spec: Value,
110    pub options: Option<Value>,
111}
112
113#[cfg(test)]
114mod tests {
115    use serde_json::json;
116
117    use super::*;
118
119    #[test]
120    fn versioned_update_result_serializes_with_camel_case() {
121        let value = serde_json::to_value(VersionedUpdateResult {
122            updated: 1,
123            version_saved: 7,
124        })
125        .expect("serialize versioned update result");
126
127        assert_eq!(value, json!({ "updated": 1, "versionSaved": 7 }));
128    }
129
130    #[test]
131    fn version_info_serializes_with_legacy_history_field_names() {
132        let value = serde_json::to_value(VersionInfo {
133            uuid: "ABC123".to_owned(),
134            version: 4,
135            at: 1_700_000_000_000,
136        })
137        .expect("serialize version info");
138
139        assert_eq!(
140            value,
141            json!({
142                "_uuid": "ABC123",
143                "_v": 4,
144                "_at": 1_700_000_000_000_u64,
145            })
146        );
147    }
148
149    #[test]
150    fn create_indexes_request_uses_index_spec_key() {
151        let value = serde_json::to_value(CreateIndexesRequest {
152            index_spec: json!({ "name": 1 }),
153            options: Some(json!({ "unique": true })),
154        })
155        .expect("serialize create indexes request");
156
157        assert_eq!(
158            value,
159            json!({
160                "indexSpec": { "name": 1 },
161                "options": { "unique": true },
162            })
163        );
164    }
165}