signer-daemon 0.2.3

Signer daemon package.
Documentation
use sea_orm::EntityTrait;

use crate::{
  entity::server,
  model::{
    crdt::crdt::{CrdtDelta, CrdtDeltaBox},
    deltaobject::server_do::ServerDO,
    viewobject::ServerVO,
  },
  reqwest_auth::ReqwestAuth,
};

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

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

  pub async fn put_server(&self, server_vo: ServerVO) -> anyhow::Result<()> {
    let r = server::Entity::find_by_id(&server_vo.addr)
      .one(&self.db)
      .await?;
    let server_do = match &r {
      Some(val) => {
        let server_do = ServerDO::new(&val.clone().into(), &server_vo)?;
        if !server_do.has_changed(&server_vo) {
          return Ok(());
        }
        server_do
      }
      None => ServerDO::from(server_vo.clone()),
    };

    let server_delta = CrdtDeltaBox::Server(CrdtDelta::Put(server_do));
    self.emit(SignerDaemonEvent::InsertDelta(server_delta))?;

    self.wait_apply().await?;

    self.emit(SignerDaemonEvent::UpdateConnections)?;

    Ok(())
  }

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

    let server_delta = CrdtDeltaBox::Server(CrdtDelta::Del(addr.to_string()));
    self.emit(SignerDaemonEvent::InsertDelta(server_delta))?;

    self.wait_apply().await?;

    self.emit(SignerDaemonEvent::UpdateConnections)?;

    Ok(())
  }

  pub async fn get_server(
    &self,
    addr: &str,
  ) -> anyhow::Result<Option<ServerVO>> {
    let r = server::Entity::find_by_id(addr).one(&self.db).await?;
    Ok(r.map(|i| i.into()))
  }

  pub async fn ping_server(&self, addr: &str) -> anyhow::Result<()> {
    let client = reqwest::Client::new();
    client
      .get(addr)
      .with_signer_auth(&self.user.lock().await.clone())
      .send()
      .await?
      .error_for_status()?;

    Ok(())
  }
}