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