use super::super::native_helpers::{NativeEventContext, enqueue_outbox_event_with_context};
use super::LockServiceImpl;
pub(crate) fn lock_event_payload(
tenant_id: &str,
project_id: &str,
lock_name: &str,
owner_id: &str,
fencing_token: i64,
) -> serde_json::Value {
serde_json::json!({
"tenant_id": tenant_id,
"project_id": project_id,
"lock_name": lock_name,
"owner_id": owner_id,
"fencing_token": fencing_token,
})
}
#[allow(clippy::too_many_arguments)]
pub(crate) async fn emit_lock_event(
svc: &LockServiceImpl,
topic: &str,
partition_key: &str,
tenant_id: &str,
project_id: &str,
lock_id: &str,
lock_name: &str,
owner_id: &str,
fencing_token: i64,
) {
let Some(pool) = svc.pg_pool.as_ref() else {
tracing::error!(
topic,
lock_id,
lock_name,
tenant_id,
"lock event dropped: no outbox Postgres pool configured for the lock native store"
);
svc.metrics.inc_outbox_enqueue_failures_total("native");
return;
};
if svc.outbox_relation.is_none() {
tracing::error!(
topic,
lock_id,
lock_name,
tenant_id,
"lock event dropped: no outbox relation configured"
);
svc.metrics.inc_outbox_enqueue_failures_total("native");
return;
}
enqueue_outbox_event_with_context(
pool,
svc.outbox_relation.as_deref(),
topic,
partition_key,
tenant_id,
project_id,
lock_event_payload(tenant_id, project_id, lock_name, owner_id, fencing_token),
NativeEventContext {
target_resource: lock_name.to_string(),
..NativeEventContext::default()
},
Some(&svc.metrics),
)
.await;
}