From dfed8c65fe184e291a78b2e930e6219603ad9994 Mon Sep 17 00:00:00 2001 From: John Tennant Date: Tue, 1 Sep 2026 12:52:35 -0400 Subject: [PATCH] Publish Project State after lifecycle changes Signed-off-by: John Tennant --- crates/buzz-relay/src/handlers/ingest.rs | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/crates/buzz-relay/src/handlers/ingest.rs b/crates/buzz-relay/src/handlers/ingest.rs index a20f6d94f0..fe9b576553 100644 --- a/crates/buzz-relay/src/handlers/ingest.rs +++ b/crates/buzz-relay/src/handlers/ingest.rs @@ -3240,6 +3240,16 @@ async fn ingest_event_inner( }); } + let project_lifecycle_coordinate = if kind_u32 == KIND_PROJECT { + Some(( + event.pubkey.to_bytes().to_vec(), + buzz_db::event::extract_d_tag(&event).unwrap_or_default(), + )) + } else { + project_deletion + .as_ref() + .map(|target| (target.owner.clone(), target.d_tag.clone())) + }; let project_lifecycle = if kind_u32 == KIND_PROJECT { Some( state @@ -3334,6 +3344,16 @@ async fn ingest_event_inner( }; if !was_inserted { + if let Some((owner, d_tag)) = project_lifecycle_coordinate.as_ref() { + if let Err(error) = + super::project_state_projection::publish_project_state_for_coordinate( + tenant, state, owner, d_tag, + ) + .await + { + warn!(%error, "Project State projection repair failed after duplicate lifecycle event"); + } + } return Ok(IngestResult { event_id: event_id_hex, accepted: true, @@ -3409,6 +3429,16 @@ async fn ingest_event_inner( ) .await; + if let Some((owner, d_tag)) = project_lifecycle_coordinate.as_ref() { + if let Err(error) = super::project_state_projection::publish_project_state_for_coordinate( + tenant, state, owner, d_tag, + ) + .await + { + warn!(%error, "Project State projection failed after lifecycle event"); + } + } + info!(event_id = %event_id_hex, kind = kind_u32, "Event ingested via pipeline"); Ok(IngestResult {