use std::path::Path;
use ito_domain::audit::event::AuditEvent;
use super::store::AuditEventStore;
#[derive(Debug, Default, Clone)]
pub struct EventFilter {
pub entity: Option<String>,
pub scope: Option<String>,
pub op: Option<String>,
}
impl EventFilter {
fn matches(&self, event: &AuditEvent) -> bool {
if let Some(entity) = &self.entity
&& event.entity != *entity
{
return false;
}
if let Some(scope) = &self.scope {
match &event.scope {
Some(event_scope) if event_scope == scope => {}
_ => return false,
}
}
if let Some(op) = &self.op
&& event.op != *op
{
return false;
}
true
}
}
pub fn read_audit_events(ito_path: &Path) -> Vec<AuditEvent> {
let store = super::store::default_audit_store(ito_path);
read_audit_events_from_store(store.as_ref())
}
pub fn read_audit_events_from_store(store: &dyn AuditEventStore) -> Vec<AuditEvent> {
store.read_all()
}
pub fn read_audit_events_filtered(ito_path: &Path, filter: &EventFilter) -> Vec<AuditEvent> {
let store = super::store::default_audit_store(ito_path);
read_audit_events_filtered_from_store(store.as_ref(), filter)
}
pub fn read_audit_events_filtered_from_store(
store: &dyn AuditEventStore,
filter: &EventFilter,
) -> Vec<AuditEvent> {
let all = read_audit_events_from_store(store);
let mut filtered = Vec::new();
for event in all {
if filter.matches(&event) {
filtered.push(event);
}
}
filtered
}
#[cfg(test)]
mod reader_tests {
include!("reader_tests.rs");
}