use sea_orm::EntityTrait;
use crate::{
entity::server,
model::{
crdt::crdt::{CrdtDelta, CrdtDeltaBox},
deltaobject::server_do::ServerDO,
viewobject::ServerVO,
},
reqwest_auth::ReqwestAuth,
};
use super::{SignerDaemon, signer_daemon_event::SignerDaemonEvent};
impl SignerDaemon {
pub async fn list_server(&self) -> anyhow::Result<Vec<ServerVO>> {
let servers = server::Entity::find().all(&self.db).await?;
Ok(servers.into_iter().map(|i| i.into()).collect())
}
pub async fn put_server(&self, server_vo: ServerVO) -> anyhow::Result<()> {
let r = server::Entity::find_by_id(&server_vo.addr)
.one(&self.db)
.await?;
let server_do = match &r {
Some(val) => {
let server_do = ServerDO::new(&val.clone().into(), &server_vo)?;
if !server_do.has_changed(&server_vo) {
return Ok(());
}
server_do
}
None => ServerDO::from(server_vo.clone()),
};
let server_delta = CrdtDeltaBox::Server(CrdtDelta::Put(server_do));
self.emit(SignerDaemonEvent::InsertDelta(server_delta))?;
self.wait_apply().await?;
self.emit(SignerDaemonEvent::UpdateConnections)?;
Ok(())
}
pub async fn del_server(&self, addr: &str) -> anyhow::Result<()> {
if self.get_server(addr).await?.is_none() {
return Ok(());
}
let server_delta = CrdtDeltaBox::Server(CrdtDelta::Del(addr.to_string()));
self.emit(SignerDaemonEvent::InsertDelta(server_delta))?;
self.wait_apply().await?;
self.emit(SignerDaemonEvent::UpdateConnections)?;
Ok(())
}
pub async fn get_server(
&self,
addr: &str,
) -> anyhow::Result<Option<ServerVO>> {
let r = server::Entity::find_by_id(addr).one(&self.db).await?;
Ok(r.map(|i| i.into()))
}
pub async fn ping_server(&self, addr: &str) -> anyhow::Result<()> {
let client = reqwest::Client::new();
client
.get(addr)
.with_signer_auth(&self.user.lock().await.clone())
.send()
.await?
.error_for_status()?;
Ok(())
}
}