signer-daemon 0.2.5

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

use crate::{
  SignerDaemon,
  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,
    _daemon: &SignerDaemon,
    tx: &DatabaseTransaction,
  ) -> anyhow::Result<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(
    _daemon: &SignerDaemon,
    key: &Self::PrimaryKey,
    tx: &DatabaseTransaction,
  ) -> anyhow::Result<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),
    }
  }
}