2023-08-27 00:07:56 +02:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
use axum::async_trait;
|
|
|
|
|
2023-08-27 16:49:53 +02:00
|
|
|
use churn_domain::{LogEvent, ServerEnrollReq};
|
2023-08-27 00:07:56 +02:00
|
|
|
use serde::{ser::SerializeStruct, Deserialize, Serialize};
|
|
|
|
use tokio::sync::{Mutex, RwLock};
|
|
|
|
|
2023-08-27 16:49:53 +02:00
|
|
|
use churn_capnp::CapnpPackExt;
|
|
|
|
|
|
|
|
use crate::db::Db;
|
|
|
|
|
2023-08-27 00:07:56 +02:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct EventService(Arc<dyn EventServiceTrait + Send + Sync + 'static>);
|
|
|
|
|
2023-08-27 16:49:53 +02:00
|
|
|
impl EventService {
|
|
|
|
pub fn new(db: Db) -> Self {
|
|
|
|
Self(Arc::new(DefaultEventService::new(db)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-27 00:07:56 +02:00
|
|
|
impl std::ops::Deref for EventService {
|
|
|
|
type Target = Arc<dyn EventServiceTrait + Send + Sync + 'static>;
|
|
|
|
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
|
|
&self.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for EventService {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self(Arc::new(DefaultEventService::default()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
struct DefaultEventService {
|
2023-08-27 16:49:53 +02:00
|
|
|
db: Db,
|
2023-08-27 00:07:56 +02:00
|
|
|
}
|
|
|
|
|
2023-08-27 16:49:53 +02:00
|
|
|
impl DefaultEventService {
|
|
|
|
pub fn new(db: Db) -> Self {
|
|
|
|
Self { db }
|
2023-08-27 00:07:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
pub trait EventServiceTrait {
|
|
|
|
async fn append(&self, req: LogEvent) -> anyhow::Result<()>;
|
|
|
|
async fn get_from_cursor(&self, cursor: uuid::Uuid) -> anyhow::Result<Vec<LogEvent>>;
|
|
|
|
async fn get_from_beginning(&self) -> anyhow::Result<Vec<LogEvent>>;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
impl EventServiceTrait for DefaultEventService {
|
|
|
|
async fn append(&self, req: LogEvent) -> anyhow::Result<()> {
|
2023-08-27 16:49:53 +02:00
|
|
|
self.db
|
|
|
|
.insert("events_log", &req.id.to_string(), &req.serialize_capnp())
|
|
|
|
.await;
|
|
|
|
|
2023-08-27 00:07:56 +02:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
async fn get_from_cursor(&self, cursor: uuid::Uuid) -> anyhow::Result<Vec<LogEvent>> {
|
2023-08-27 16:49:53 +02:00
|
|
|
let events = self.db.get_all("events_log").await?;
|
|
|
|
|
|
|
|
let events = events
|
2023-08-27 00:07:56 +02:00
|
|
|
.iter()
|
2023-08-27 16:49:53 +02:00
|
|
|
.map(|e| LogEvent::deserialize_capnp(e))
|
|
|
|
.flatten()
|
2023-08-27 00:07:56 +02:00
|
|
|
.skip_while(|item| item.id != cursor)
|
|
|
|
.skip(1)
|
2023-08-27 16:49:53 +02:00
|
|
|
.collect();
|
|
|
|
|
|
|
|
Ok(events)
|
2023-08-27 00:07:56 +02:00
|
|
|
}
|
|
|
|
async fn get_from_beginning(&self) -> anyhow::Result<Vec<LogEvent>> {
|
2023-08-27 16:49:53 +02:00
|
|
|
let events = self.db.get_all("events_log").await?;
|
|
|
|
|
|
|
|
let events = events
|
|
|
|
.iter()
|
|
|
|
.map(|e| LogEvent::deserialize_capnp(e))
|
|
|
|
.flatten()
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
Ok(events)
|
2023-08-27 00:07:56 +02:00
|
|
|
}
|
|
|
|
}
|