use std::str::FromStr;
use sea_orm::EntityTrait;
use crate::{
entity::oper_log,
model::{
crdt::crdt::{CrdtDelta, CrdtDeltaBox},
deltaobject::oper_log_do::OperLogDO,
viewobject::OperLogVO,
},
};
use super::{SignerDaemon, signer_daemon_event::SignerDaemonEvent};
impl SignerDaemon {
pub async fn list_oper_log(&self) -> anyhow::Result<Vec<OperLogVO>> {
let r = oper_log::Entity::find().all(&self.db).await?;
Ok(r.into_iter().map(|i| i.into()).collect())
}
pub async fn put_oper_log(
&self,
oper_log_vo: OperLogVO,
) -> anyhow::Result<()> {
let id = uuid::Uuid::from_str(&oper_log_vo.id)?;
let r = oper_log::Entity::find_by_id(id).one(&self.db).await?;
let ol_do = match r {
Some(val) => {
let ol_do = OperLogDO::new(&val.clone().into(), &oper_log_vo)?;
if !ol_do.has_changed(&oper_log_vo) {
return Ok(());
}
ol_do
}
None => OperLogDO::from(oper_log_vo.clone()),
};
let delta = CrdtDeltaBox::OperLog(CrdtDelta::Put(ol_do));
self.emit(SignerDaemonEvent::InsertDelta(delta))?;
self.wait_apply().await?;
Ok(())
}
pub async fn del_oper_log(&self, id: &str) -> anyhow::Result<()> {
if self.get_oper_log(id).await?.is_none() {
return Ok(());
}
let delta = CrdtDeltaBox::OperLog(CrdtDelta::Del(id.to_string()));
self.emit(SignerDaemonEvent::InsertDelta(delta))?;
Ok(())
}
pub async fn get_oper_log(
&self,
id: &str,
) -> anyhow::Result<Option<OperLogVO>> {
let id = uuid::Uuid::from_str(id)?;
let r = oper_log::Entity::find_by_id(id).one(&self.db).await?;
Ok(r.map(|i| i.into()))
}
}