use std::sync::Arc;
use crate::db::{ConnExt, CursorPage, CursorRequest, Database, ValidatedFilter};
use crate::error::Result;
use super::record::AuditRecord;
const COLS: &str = "id, actor, action, resource_type, resource_id, metadata, \
ip, user_agent, fingerprint, tenant_id, created_at";
#[derive(Clone)]
pub struct AuditRepo {
inner: Arc<AuditRepoInner>,
}
struct AuditRepoInner {
db: Database,
}
impl AuditRepo {
pub fn new(db: Database) -> Self {
Self {
inner: Arc::new(AuditRepoInner { db }),
}
}
pub async fn list(&self, req: CursorRequest) -> Result<CursorPage<AuditRecord>> {
self.inner
.db
.conn()
.select(&format!("SELECT {COLS} FROM audit_log"))
.cursor::<AuditRecord>(req)
.await
}
pub async fn query(
&self,
filter: ValidatedFilter,
req: CursorRequest,
) -> Result<CursorPage<AuditRecord>> {
self.inner
.db
.conn()
.select(&format!("SELECT {COLS} FROM audit_log"))
.filter(filter)
.cursor::<AuditRecord>(req)
.await
}
}