signer-crdt 0.4.1

Signer CRDT (Conflict-free Replicated Data Type) package.
Documentation
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 {
    /// 插入单个 CRDT 事件到数据库
    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(())
    }

    /// 插入多个 CRDT 事件到数据库
    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, // 添加缺失的 deps 字段,初始化为 None
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_insert_crdt_event_compiles() {
        // 创建测试用的 CrdtEventVO
        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() {
        // 创建测试用的 CrdtEventVO 列表
        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,
            },
        ];

        // 确保方法签名正确并且能够编译
        // 实际的数据库测试需要在集成测试环境中进行
    }
}