Ports, schema and failing tests for the subscriber half of S-19b-2, ahead of the implementation. The subscriber now listens on the `objecten` kanaal instead of `zaken`. An Objecten notification carries no record data — only the object URL — so the record is read back through the ACL (§8.1), and the zaak-shaped surface goes away: IsZaakCreated / IsZaakStatusSet / ZaakUrl / ZaakId and ToEntry's `Resource == "status"` mapping are replaced by IsRegisterRecordWritten + ObjectUrl. The notification log now holds the projected row itself (register id, status, reference), so a rebuild is a replay with no mapping rules and no upstream reads. The migration drops the old columns rather than renaming them — EF scaffolded renames that would have carried ZGW values into columns meaning something else — and empties both tables, since a pre-slice row is neither reprojectable nor re-derivable from the new source. Red: HandleAsync recognises a register write but does not yet read or project it, so the seven projection assertions fail on an empty store.
31 lines
1.4 KiB
C#
31 lines
1.4 KiB
C#
namespace EventSubscriber.Application;
|
|
|
|
/// <summary>
|
|
/// An inbound NRC (Open Notificaties) notification, as Open Notificaties POSTs it to an
|
|
/// abonnement callback. Only the fields the projection needs are modelled.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Since S-19b-2 the subscriber listens on the <c>objecten</c> kanaal, not <c>zaken</c>: the
|
|
/// register record in Objecten is what the projection is derived from (ADR-0030), so the
|
|
/// projection is a cache of the register rather than a re-derivation of the case system. An
|
|
/// Objecten notification carries <b>no record data</b> — only the object URL (as both
|
|
/// <c>hoofdObject</c> and <c>resourceUrl</c>) and the objecttype as a kenmerk — so the record
|
|
/// itself is read back through the ACL.
|
|
/// </remarks>
|
|
public sealed record Notification(
|
|
string Kanaal,
|
|
string Resource,
|
|
string Actie,
|
|
Uri ResourceUrl,
|
|
Uri? HoofdObject = null)
|
|
{
|
|
/// <summary>A register record written to Objecten — <c>create</c> on submit, <c>update</c> on
|
|
/// approval, since the ACL upserts the same object for a registration (§8.6).</summary>
|
|
public bool IsRegisterRecordWritten =>
|
|
Kanaal == "objecten" && Resource == "object" && Actie is "create" or "update";
|
|
|
|
/// <summary>The object holding the register record. Objecten sets both fields to the object;
|
|
/// <c>hoofdObject</c> is the main resource by definition, so prefer it.</summary>
|
|
public Uri ObjectUrl => HoofdObject ?? ResourceUrl;
|
|
}
|