signer-crdt 0.4.1

Signer CRDT (Conflict-free Replicated Data Type) package.
Documentation
use crate::{MessageVO, SignerMeta, ViewError, message};
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageKeyVO {
    pub chat_key: String,
    pub chat_variant: String,
    pub user_key: String,
    pub message_id: String,
}

impl MessageKeyVO {
    pub async fn from_message(meta: &SignerMeta, message: &MessageVO) -> Result<Self, ViewError> {
        let chat_key = message.chat.chat_key(&meta).await?;
        let chat_variant = message.chat.chat_variant();
        let user_key = message.user_key.clone();
        let message_id = message.id.clone();
        Ok(Self {
            chat_key,
            chat_variant,
            user_key,
            message_id,
        })
    }

    pub async fn get_message(&self, meta: &SignerMeta) -> Result<Option<MessageVO>, ViewError> {
        let m = message::Entity::find()
            .filter(
                message::Column::Id.eq(self.message_id.clone()).and(
                    message::Column::UserKey.eq(self.user_key.clone()).and(
                        message::Column::ChatKey
                            .eq(self.chat_key.clone())
                            .and(message::Column::ChatVariant.eq(self.chat_variant.clone())),
                    ),
                ),
            )
            .one(&meta.conn)
            .await?;
        match m {
            None => Ok(None),
            Some(val) => Ok(Some(MessageVO::from_model(&meta.conn, &val).await?)),
        }
    }
}