atomr_persistence_mongodb/
documents.rs1use 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}