signer-daemon 0.2.3

Signer daemon package.
Documentation
use sea_orm::EntityTrait as _;

use crate::{
  entity::user,
  model::{
    crdt::crdt::{CrdtDelta, CrdtDeltaBox},
    deltaobject::user_do::UserDO,
    viewobject::UserVO,
  },
};

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

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

  pub async fn put_user(&self, user_vo: UserVO) -> anyhow::Result<()> {
    let e = user::Entity::find_by_id(&user_vo.pub_key)
      .one(&self.db)
      .await?;

    let user_do = match &e {
      None => UserDO::from(user_vo.clone()),
      Some(e) => {
        let user_do = UserDO::new(&e.clone().into(), &user_vo)?;
        if !user_do.has_changed(&user_vo) {
          return Ok(());
        }
        user_do
      }
    };

    let user_delta = CrdtDeltaBox::User(CrdtDelta::Put(user_do));
    self.emit(SignerDaemonEvent::InsertDelta(user_delta))?;

    Ok(())
  }

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

    let user_delta = CrdtDeltaBox::User(CrdtDelta::Del(pub_key.to_string()));
    self.emit(SignerDaemonEvent::InsertDelta(user_delta))?;

    self.wait_apply().await?;

    Ok(())
  }

  pub async fn get_user(
    &self,
    pub_key: &str,
  ) -> anyhow::Result<Option<UserVO>> {
    let u = user::Entity::find_by_id(pub_key).one(&self.db).await?;

    Ok(u.map(|i| i.into()))
  }
}