Skip to main content

atomr_persistence_mongodb/
documents.rs

1//! BSON-friendly document shapes. `payload` is stored as raw bytes
2//! via BSON `Binary`.
3
4use atomr_persistence::{PersistentRepr, SnapshotMetadata};
5use mongodb::bson::{spec::BinarySubtype, Binary};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct EventDoc {
10    pub persistence_id: String,
11    pub sequence_nr: i64,
12    pub payload: Binary,
13    pub manifest: String,
14    pub writer_uuid: String,
15    pub deleted: bool,
16    pub tags: Vec<String>,
17    pub created_at: i64,
18}
19
20impl EventDoc {
21    pub fn from_repr(r: &PersistentRepr, created_at: i64) -> Self {
22        Self {
23            persistence_id: r.persistence_id.clone(),
24            sequence_nr: r.sequence_nr as i64,
25            payload: Binary { subtype: BinarySubtype::Generic, bytes: r.payload.clone() },
26            manifest: r.manifest.clone(),
27            writer_uuid: r.writer_uuid.clone(),
28            deleted: r.deleted,
29            tags: r.tags.clone(),
30            created_at,
31        }
32    }
33
34    pub fn into_repr(self) -> PersistentRepr {
35        PersistentRepr {
36            persistence_id: self.persistence_id,
37            sequence_nr: self.sequence_nr as u64,
38            payload: self.payload.bytes,
39            manifest: self.manifest,
40            writer_uuid: self.writer_uuid,
41            deleted: self.deleted,
42            tags: self.tags,
43        }
44    }
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct SnapshotDoc {
49    pub persistence_id: String,
50    pub sequence_nr: i64,
51    pub payload: Binary,
52    pub timestamp: i64,
53    pub created_at: i64,
54}
55
56impl SnapshotDoc {
57    pub fn from_meta(meta: &SnapshotMetadata, payload: Vec<u8>, created_at: i64) -> Self {
58        Self {
59            persistence_id: meta.persistence_id.clone(),
60            sequence_nr: meta.sequence_nr as i64,
61            payload: Binary { subtype: BinarySubtype::Generic, bytes: payload },
62            timestamp: meta.timestamp as i64,
63            created_at,
64        }
65    }
66
67    pub fn into_parts(self) -> (SnapshotMetadata, Vec<u8>) {
68        (
69            SnapshotMetadata {
70                persistence_id: self.persistence_id,
71                sequence_nr: self.sequence_nr as u64,
72                timestamp: self.timestamp as u64,
73            },
74            self.payload.bytes,
75        )
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn event_round_trip() {
85        let original = PersistentRepr {
86            persistence_id: "p".into(),
87            sequence_nr: 3,
88            payload: vec![1, 2, 3],
89            manifest: "m".into(),
90            writer_uuid: "w".into(),
91            deleted: false,
92            tags: vec!["x".into()],
93        };
94        let doc = EventDoc::from_repr(&original, 100);
95        let back = doc.into_repr();
96        assert_eq!(back.payload, original.payload);
97        assert_eq!(back.tags, original.tags);
98    }
99}