use sea_orm::{ActiveModelTrait, ActiveValue::Set, DatabaseTransaction, EntityTrait};
use crate::{
SignerDaemonCore,
entity::server,
model::{deltaobject::server_do::ServerDO, viewobject::ServerVO},
};
use super::{CrdtType, crdt::CrdtDelta};
impl CrdtType for ServerDO {
type PrimaryKey = String;
async fn put(
&self,
_core: &SignerDaemonCore,
tx: &DatabaseTransaction,
) -> crate::DaemonResult<CrdtDelta<Self>> {
let s = server::Entity::find_by_id(&self.addr).one(tx).await?;
if let Some(val) = &s {
if !self.has_changed(&val.clone().into()) {
return Ok(CrdtDelta::Skip);
}
}
let m = server::ActiveModel {
addr: Set(self.addr.clone()),
enable: self.enable.clone().into(),
limitation_set: self.limitation_set.clone().into(),
};
match s {
Some(val) => {
let s = m.update(tx).await?;
let server_do = ServerDO::new(&s.into(), &val.into())?;
Ok(CrdtDelta::Put(server_do))
}
None => {
let s = m.insert(tx).await?;
Ok(CrdtDelta::Del(s.addr))
}
}
}
async fn del(
_core: &SignerDaemonCore,
key: &Self::PrimaryKey,
tx: &DatabaseTransaction,
) -> crate::DaemonResult<CrdtDelta<Self>> {
let s = server::Entity::find_by_id(key).one(tx).await?;
match s {
Some(val) => {
let server_do = ServerDO::from(ServerVO::from(val.clone()));
server::Entity::delete_by_id(&val.addr).exec(tx).await?;
Ok(CrdtDelta::Put(server_do))
}
None => Ok(CrdtDelta::Skip),
}
}
}