namespace PIESL.Infrastructure; /// /// Dapr pub/sub topic names for PIE events. /// Consumers subscribe to these topics; PIE publishes to them via OutBox or DaprClient. /// /// OutBox topics (guaranteed delivery — write in same DB transaction as business data): /// pie.module.updated → IDMS cache invalidation /// pie.profile.published → QuickStart / IDMS rebuild profile cache /// pie.profile.deprecated → mark stale in downstream /// pie.proposal.created → product admin notification /// pie.proposal.reviewed → product admin notification /// pie.estimate.calculated → IDMS engagement seeding /// /// Fire-and-forget topics (non-critical analytics; loss acceptable): /// pie.outcome.recorded → AEO / analytics side-effect /// pie.signal.detected → product team notification (Phase 2) /// pie.aeo.gap.detected → AEO gap signals (Phase 2) /// public static class PIEEventTopics { // ── OutBox-backed (transactional) ────────────────────────────────────────── public const string ModuleUpdated = "pie.module.updated"; public const string ProfilePublished = "pie.profile.published"; public const string ProfileDeprecated = "pie.profile.deprecated"; public const string ProposalCreated = "pie.proposal.created"; public const string ProposalReviewed = "pie.proposal.reviewed"; public const string EstimateCalculated = "pie.estimate.calculated"; // ── Fire-and-forget (non-transactional) ─────────────────────────────────── public const string OutcomeRecorded = "pie.outcome.recorded"; public const string SignalDetected = "pie.signal.detected"; // Phase 2 public const string AeoGapDetected = "pie.aeo.gap.detected"; // Phase 2 // ── Inbound subscriptions (PIE receives from IDMS) ──────────────────────── public const string EngagementCompleted = "idms.engagement.completed"; public const string GoLiveDeclared = "idms.golive.declared"; // ── Dapr component name ─────────────────────────────────────────────────── public const string PubSubName = "pubsub"; }