use sea_orm::EntityTrait as _;
use crate::{
entity::user,
model::{
crdt::crdt::{CrdtDelta, CrdtDeltaBox},
deltaobject::user_do::UserDO,
viewobject::UserVO,
},
};
use super::{SignerDaemon, signer_daemon_event::SignerDaemonEvent};
impl SignerDaemon {
pub async fn list_user(&self) -> anyhow::Result<Vec<UserVO>> {
let users = user::Entity::find().all(&self.db).await?;
Ok(users.into_iter().map(|i| i.into()).collect())
}
pub async fn put_user(&self, user_vo: UserVO) -> anyhow::Result<()> {
let e = user::Entity::find_by_id(&user_vo.pub_key)
.one(&self.db)
.await?;
let user_do = match &e {
None => UserDO::from(user_vo.clone()),
Some(e) => {
let user_do = UserDO::new(&e.clone().into(), &user_vo)?;
if !user_do.has_changed(&user_vo) {
return Ok(());
}
user_do
}
};
let user_delta = CrdtDeltaBox::User(CrdtDelta::Put(user_do));
self.emit(SignerDaemonEvent::InsertDelta(user_delta))?;
Ok(())
}
pub async fn del_user(&self, pub_key: &str) -> anyhow::Result<()> {
if self.get_user(pub_key).await?.is_none() {
return Ok(());
}
let user_delta = CrdtDeltaBox::User(CrdtDelta::Del(pub_key.to_string()));
self.emit(SignerDaemonEvent::InsertDelta(user_delta))?;
self.wait_apply().await?;
Ok(())
}
pub async fn get_user(
&self,
pub_key: &str,
) -> anyhow::Result<Option<UserVO>> {
let u = user::Entity::find_by_id(pub_key).one(&self.db).await?;
Ok(u.map(|i| i.into()))
}
}