signer-daemon 0.2.1

Signer daemon package.
Documentation
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};

use crate::{
  entity::message,
  model::{
    crdt::{
      crdt::{CrdtDelta, CrdtDeltaBox},
      crdt_message::MessageKey,
    },
    deltaobject::message_do::MessageDO,
    viewobject::{MessageContent, MessageVO},
  },
};

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

impl SignerDaemon {
  pub async fn list_message(&self) -> anyhow::Result<Vec<MessageVO>> {
    let r = message::Entity::find().all(&self.db).await?;
    let mut messages = Vec::new();
    for i in r {
      messages.push(MessageVO::from_model(&self.db, &i).await?);
    }
    Ok(messages)
  }

  pub async fn put_message(&self, vo: MessageVO) -> anyhow::Result<()> {
    self.put_chat(vo.chat.clone()).await?;

    let r = message::Entity::find()
      .filter(
        message::Column::Id.eq(&vo.id).and(
          message::Column::UserKey
            .eq(&vo.user_key)
            .and(message::Column::ChatKey.eq(&vo.chat.chat_key(&self).await?))
            .and(message::Column::ChatVariant.eq(&vo.chat.chat_variant())),
        ),
      )
      .one(&self.db)
      .await?;

    let message_do = match &r {
      Some(val) => {
        let message_do =
          MessageDO::new(&MessageVO::from_model(&self.db, &val).await?, &vo)?;
        if !message_do.has_changed(&vo) {
          return Ok(());
        }
        message_do
      }
      None => MessageDO::from(vo.clone()),
    };

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

    self.wait_apply().await?;

    Ok(())
  }

  pub async fn del_message(
    &self,
    id: &str,
    user_key: &str,
    chat_key: &str,
    chat_variant: &str,
  ) -> anyhow::Result<()> {
    if self
      .get_message(id, user_key, chat_key, chat_variant)
      .await?
      .is_none()
    {
      return Ok(());
    }

    let delta = CrdtDeltaBox::Message(CrdtDelta::Del(MessageKey {
      id: id.to_string(),
      user_key: user_key.to_string(),
      chat_key: chat_key.to_string(),
      chat_variant: chat_variant.to_string(),
    }));
    self.emit(SignerDaemonEvent::InsertDelta(delta))?;

    Ok(())
  }

  pub async fn get_message(
    &self,
    id: &str,
    user_key: &str,
    chat_key: &str,
    chat_variant: &str,
  ) -> anyhow::Result<Option<MessageVO>> {
    let r = message::Entity::find()
      .filter(
        message::Column::Id.eq(id).and(
          message::Column::UserKey
            .eq(user_key)
            .and(message::Column::ChatKey.eq(chat_key))
            .and(message::Column::ChatVariant.eq(chat_variant)),
        ),
      )
      .one(&self.db)
      .await?;

    let m = match &r {
      None => None,
      Some(val) => Some(MessageVO::from_model(&self.db, val).await?),
    };

    Ok(m)
  }

  pub async fn list_check_message(
    &self,
    id: &str,
    user_key: &str,
    chat_key: &str,
    chat_variant: &str,
  ) -> anyhow::Result<Vec<MessageVO>> {
    let r = message::Entity::find()
      .filter(
        message::Column::ParentId
          .eq(id)
          .and(message::Column::ParentUserKey.eq(user_key))
          .and(message::Column::ChatKey.eq(chat_key))
          .and(message::Column::ChatVariant.eq(chat_variant))
          .and(
            message::Column::Content
              .eq(serde_json::to_string(&MessageContent::Check)?),
          ),
      )
      .all(&self.db)
      .await?;

    let mut messages = Vec::new();
    for i in r {
      messages.push(MessageVO::from_model(&self.db, &i).await?);
    }

    Ok(messages)
  }
}