signer-daemon 0.3.2

Signer daemon package.
Documentation
use sea_orm::{ActiveModelTrait, ActiveValue::Set, DatabaseTransaction, EntityTrait};

use crate::{
    SignerDaemonCore,
    entity::server,
    model::{deltaobject::server_do::ServerDO, viewobject::ServerVO},
};

use super::{CrdtType, crdt::CrdtDelta};

impl CrdtType for ServerDO {
    type PrimaryKey = String;

    async fn put(
        &self,
        _core: &SignerDaemonCore,
        tx: &DatabaseTransaction,
    ) -> crate::DaemonResult<CrdtDelta<Self>> {
        let s = server::Entity::find_by_id(&self.addr).one(tx).await?;
        if let Some(val) = &s {
            if !self.has_changed(&val.clone().into()) {
                return Ok(CrdtDelta::Skip);
            }
        }

        let m = server::ActiveModel {
            addr: Set(self.addr.clone()),
            enable: self.enable.clone().into(),
            limitation_set: self.limitation_set.clone().into(),
        };

        match s {
            Some(val) => {
                let s = m.update(tx).await?;
                let server_do = ServerDO::new(&s.into(), &val.into())?;
                Ok(CrdtDelta::Put(server_do))
            }
            None => {
                let s = m.insert(tx).await?;
                Ok(CrdtDelta::Del(s.addr))
            }
        }
    }

    async fn del(
        _core: &SignerDaemonCore,
        key: &Self::PrimaryKey,
        tx: &DatabaseTransaction,
    ) -> crate::DaemonResult<CrdtDelta<Self>> {
        let s = server::Entity::find_by_id(key).one(tx).await?;
        match s {
            Some(val) => {
                let server_do = ServerDO::from(ServerVO::from(val.clone()));
                server::Entity::delete_by_id(&val.addr).exec(tx).await?;

                Ok(CrdtDelta::Put(server_do))
            }
            None => Ok(CrdtDelta::Skip),
        }
    }
}