Ports and failing tests for the ACL half of S-19b-2, ahead of the implementation. Once the projection is sourced from Objecten (ADR-0028's stated direction), a submitted registration has to exist in the register the moment the zaak is opened — otherwise re-sourcing silently drops every INGEDIEND row, since today only approval writes a record. So `OpenZaakAsync` gains a second write, and approval upserts that same record to INGESCHREVEN. The subscriber gets only an object URL on an `objecten` notification (the payload carries no record data) and may not read Objecten itself (§8.1), so `IRegisterRecordGateway` gains a read and `AclService` exposes it. Red: - AclService does not yet write on open → the record assertion fails on an empty list. - ObjectenGateway.GetAsync is a shell throwing NotImplementedException; its tests pin the contract: fetch the object URL directly (no objecttype resolution, no search), the CRS header a geo API requires, static Token auth, and a 404 read as "nothing to project" rather than an error (§8.6).
39 lines
1.7 KiB
C#
39 lines
1.7 KiB
C#
namespace Acl.Application;
|
|
|
|
/// <summary>
|
|
/// Port to the Objecten API, which holds the authoritative register record (S-19a, ADR-0028).
|
|
/// Implemented in Infrastructure — as with ZGW, the ACL is the only code that talks to the
|
|
/// upstream Common Ground module (§8.1).
|
|
/// </summary>
|
|
public interface IRegisterRecordGateway
|
|
{
|
|
/// <summary>
|
|
/// Write the register record for a registration, creating it if absent and updating it if it
|
|
/// already exists. Idempotent on <see cref="RegisterRecord.Id"/>: a replayed approval updates
|
|
/// the existing object instead of creating a second one (§8.6).
|
|
/// </summary>
|
|
Task UpsertAsync(RegisterRecord record, CancellationToken ct = default);
|
|
|
|
/// <summary>
|
|
/// The register record held by the object at <paramref name="objectUrl"/>, or <c>null</c> if that
|
|
/// object holds none. The Event Subscriber projects a register write from the notification NRC
|
|
/// delivers, which carries only the object URL — so it reads the record back through the ACL
|
|
/// rather than talking to Objecten itself (§8.1, S-19b-2).
|
|
/// </summary>
|
|
Task<RegisterRecord?> GetAsync(Uri objectUrl, CancellationToken ct = default);
|
|
}
|
|
|
|
/// <summary>
|
|
/// The public-safe register record, matching the <c>RegisterRecord</c> objecttype schema registered
|
|
/// in S-18c (ADR-0027). No bsn, no name — the register is world-readable.
|
|
/// </summary>
|
|
public sealed record RegisterRecord(string Id, string Status, string? Reference);
|
|
|
|
/// <summary>The register statuses the RegisterRecord objecttype's schema allows (ADR-0027).</summary>
|
|
public static class RegisterRecordStatus
|
|
{
|
|
public const string Ingediend = "INGEDIEND";
|
|
|
|
public const string Ingeschreven = "INGESCHREVEN";
|
|
}
|