use crate::models::active_backend_modules::SqlAppModule;
use myc_core::domain::dtos::resource_audit_log::NewResourceAuditLogEvent;
use shaku::HasComponent;
use std::sync::Arc;
use tokio::sync::mpsc;
#[cfg(any(feature = "full", feature = "postgres-only"))]
#[tracing::instrument(name = "resource_audit_log_dispatcher", skip_all)]
pub(crate) async fn resource_audit_log_dispatcher(
app_modules: Arc<SqlAppModule>,
mut receiver: mpsc::Receiver<NewResourceAuditLogEvent>,
) {
use myc_diesel::models::config::DbPoolProvider;
use myc_diesel::repositories::append_resource_audit_log_row;
tokio::spawn(async move {
tracing::info!("Starting resource audit log dispatcher");
let pool_provider: &dyn DbPoolProvider = app_modules.resolve_ref();
while let Some(event) = receiver.recv().await {
let mut conn = match pool_provider.get_pool().get() {
Ok(conn) => conn,
Err(err) => {
tracing::error!(
error = ?err,
"resource_audit_log_dispatcher: failed to get db connection"
);
continue;
}
};
if let Err(err) = append_resource_audit_log_row(&mut conn, &event) {
tracing::error!(
error = ?err,
resource_type = ?event.resource_type,
resource_id = %event.resource_id,
"resource_audit_log_dispatcher: insert failed"
);
continue;
}
}
});
}
#[cfg(feature = "standalone")]
#[tracing::instrument(name = "resource_audit_log_dispatcher", skip_all)]
pub(crate) async fn resource_audit_log_dispatcher(
app_modules: Arc<SqlAppModule>,
mut receiver: mpsc::Receiver<NewResourceAuditLogEvent>,
) {
use myc_diesel_sqlite::config::SqliteDbPoolProvider;
use myc_diesel_sqlite::repositories::resource_audit_log::append_resource_audit_log_row;
tokio::spawn(async move {
tracing::info!("Starting resource audit log dispatcher");
let pool_provider: &dyn SqliteDbPoolProvider =
app_modules.resolve_ref();
while let Some(event) = receiver.recv().await {
let mut conn = match pool_provider.get_pool().get() {
Ok(conn) => conn,
Err(err) => {
tracing::error!(
error = ?err,
"resource_audit_log_dispatcher: failed to get db connection"
);
continue;
}
};
if let Err(err) = append_resource_audit_log_row(&mut conn, &event) {
tracing::error!(
error = ?err,
resource_type = ?event.resource_type,
resource_id = %event.resource_id,
"resource_audit_log_dispatcher: insert failed"
);
continue;
}
}
});
}