use crate::{SignerDaemonCore, entity::crdt_event};
use sea_orm::{QueryOrder as _, prelude::*};
pub struct CrdtAdapterController {
core: SignerDaemonCore,
}
impl CrdtAdapterController {
pub fn new(core: SignerDaemonCore) -> Self {
Self { core }
}
pub async fn apply_all(&mut self) -> crate::DaemonResult<()> {
let anchor = crdt_event::Entity::find()
.filter(crdt_event::Column::Revert.is_null())
.order_by_asc(crdt_event::Column::Clock)
.order_by_asc(crdt_event::Column::Peer)
.one(&self.core.db)
.await
.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"find anchor failed: {}",
e
)))
})?;
if let Some(anchor) = &anchor {
let revert_vec = crdt_event::Entity::find()
.filter(
crdt_event::Column::Revert.is_not_null().and(
crdt_event::Column::Clock
.gt(anchor.clock)
.or(crdt_event::Column::Clock
.eq(anchor.clock)
.and(crdt_event::Column::Peer.gt(&anchor.peer))),
),
)
.order_by_desc(crdt_event::Column::Clock)
.order_by_desc(crdt_event::Column::Peer)
.all(&self.core.db)
.await
.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"find revert events failed: {}",
e
)))
})?;
for revert in revert_vec {
revert.revert(&self.core).await.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"apply event {:?} failed: {}",
revert, e
)))
})?;
}
}
let apply_vec = match anchor {
Some(anchor) => crdt_event::Entity::find()
.filter(
crdt_event::Column::Clock
.gt(anchor.clock)
.or(crdt_event::Column::Clock
.eq(anchor.clock)
.and(crdt_event::Column::Peer.gte(anchor.peer))),
)
.order_by_asc(crdt_event::Column::Clock)
.order_by_asc(crdt_event::Column::Peer)
.all(&self.core.db)
.await
.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"find apply events failed: {}",
e
)))
})?,
None => crdt_event::Entity::find()
.order_by_asc(crdt_event::Column::Clock)
.order_by_asc(crdt_event::Column::Peer)
.all(&self.core.db)
.await
.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"find apply events failed: {}",
e
)))
})?,
};
for apply in apply_vec {
apply.apply(&self.core).await.map_err(|e| {
crate::DaemonError::Signer(crate::SignerError::Msg(format!(
"apply event {:?} failed: {}",
apply, e
)))
})?;
}
Ok(())
}
}