namespace EventSubscriber.Application; /// /// An inbound NRC (Open Notificaties) notification, as Open Notificaties POSTs it to an /// abonnement callback. Only the fields the projection needs are modelled; the full ZGW /// "Notificatie" resource also carries aanmaakdatum and kenmerken which the /// minimal projection ignores (bsn is deferred — see ADR-0008). For a zaken/zaak/create /// notification hoofdObject and resourceUrl are both the created zaak's URL. /// public sealed record Notification( string Kanaal, string Resource, string Actie, Uri ResourceUrl) { /// The only event the walking-skeleton projection reacts to: a zaak being created. public bool IsZaakCreated => Kanaal == "zaken" && Resource == "zaak" && Actie == "create"; /// The zaak UUID — the trailing path segment of the resource URL — used as the projection key. public string ZaakId => ResourceUrl.Segments[^1].Trim('/'); /// /// A deterministic dedup key. Open Notificaties carries no notification id and may /// redeliver, so the key is derived from the immutable notification content: two /// deliveries of the same zaak-create collapse to one. (NRC may also deliver /// out of order; the projector tolerates that — order does not change the outcome.) /// public string IdempotencyKey => $"{Kanaal}:{Resource}:{Actie}:{ResourceUrl}"; }