use sea_orm::EntityTrait;
use serde::{Deserialize, Serialize};
use crate::{entity::crdt_event, errors::ViewError, SignerMeta};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CrdtEventVO {
pub clock: i32,
pub peer: String,
pub payload: String,
pub revert: Option<String>,
}
impl CrdtEventVO {
pub async fn insert(&self, meta: &SignerMeta) -> Result<(), ViewError> {
let model: crdt_event::Model = self.clone().into();
let active_model = crdt_event::ActiveModel::from(model);
crdt_event::Entity::insert(active_model)
.exec(&meta.conn)
.await?;
Ok(())
}
pub async fn insert_many(events: Vec<CrdtEventVO>, meta: &SignerMeta) -> Result<(), ViewError> {
let models = events
.into_iter()
.map(|event| {
let model: crdt_event::Model = event.into();
crdt_event::ActiveModel::from(model)
})
.collect::<Vec<crdt_event::ActiveModel>>();
crdt_event::Entity::insert_many(models)
.exec(&meta.conn)
.await?;
Ok(())
}
}
impl From<crdt_event::Model> for CrdtEventVO {
fn from(value: crdt_event::Model) -> Self {
Self {
clock: value.clock,
peer: value.peer,
payload: value.payload,
revert: value.revert,
}
}
}
impl Into<crdt_event::Model> for CrdtEventVO {
fn into(self) -> crdt_event::Model {
crdt_event::Model {
clock: self.clock,
peer: self.peer,
payload: self.payload,
revert: self.revert,
deps: None, }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_insert_crdt_event_compiles() {
let _event = CrdtEventVO {
clock: 1,
peer: "test_peer".to_string(),
payload: "test_payload".to_string(),
revert: Some("test_revert".to_string()),
};
}
#[test]
fn test_insert_many_crdt_events_compiles() {
let _events = vec![
CrdtEventVO {
clock: 1,
peer: "test_peer1".to_string(),
payload: "test_payload1".to_string(),
revert: Some("test_revert1".to_string()),
},
CrdtEventVO {
clock: 2,
peer: "test_peer2".to_string(),
payload: "test_payload2".to_string(),
revert: None,
},
];
}
}