signer-daemon 0.2.1

Signer daemon package.
Documentation
use std::str::FromStr;

use sea_orm::EntityTrait;

use crate::{
  entity::oper_log,
  model::{
    crdt::crdt::{CrdtDelta, CrdtDeltaBox},
    deltaobject::oper_log_do::OperLogDO,
    viewobject::OperLogVO,
  },
};

use super::{SignerDaemon, signer_daemon_event::SignerDaemonEvent};

impl SignerDaemon {
  pub async fn list_oper_log(&self) -> anyhow::Result<Vec<OperLogVO>> {
    let r = oper_log::Entity::find().all(&self.db).await?;
    Ok(r.into_iter().map(|i| i.into()).collect())
  }

  pub async fn put_oper_log(
    &self,
    oper_log_vo: OperLogVO,
  ) -> anyhow::Result<()> {
    let id = uuid::Uuid::from_str(&oper_log_vo.id)?;
    let r = oper_log::Entity::find_by_id(id).one(&self.db).await?;

    let ol_do = match r {
      Some(val) => {
        let ol_do = OperLogDO::new(&val.clone().into(), &oper_log_vo)?;
        if !ol_do.has_changed(&oper_log_vo) {
          return Ok(());
        }
        ol_do
      }
      None => OperLogDO::from(oper_log_vo.clone()),
    };

    let delta = CrdtDeltaBox::OperLog(CrdtDelta::Put(ol_do));
    self.emit(SignerDaemonEvent::InsertDelta(delta))?;

    self.wait_apply().await?;

    Ok(())
  }

  pub async fn del_oper_log(&self, id: &str) -> anyhow::Result<()> {
    if self.get_oper_log(id).await?.is_none() {
      return Ok(());
    }

    let delta = CrdtDeltaBox::OperLog(CrdtDelta::Del(id.to_string()));
    self.emit(SignerDaemonEvent::InsertDelta(delta))?;

    Ok(())
  }

  pub async fn get_oper_log(
    &self,
    id: &str,
  ) -> anyhow::Result<Option<OperLogVO>> {
    let id = uuid::Uuid::from_str(id)?;
    let r = oper_log::Entity::find_by_id(id).one(&self.db).await?;
    Ok(r.map(|i| i.into()))
  }
}