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?)),
}
}
}