feat(domain): werkbak query + GET /behandel/werkbak (refs #13)
The Werkbak use-case reads the open Beoordelen tasks (§8.2) and enriches each with its aggregate's bsn + status; exposed as GET /behandel/werkbak for the BFF to proxy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,7 @@ builder.Services.AddHttpClient<IAclClient, AclHttpClient>();
|
|||||||
builder.Services.AddScoped<SubmitRegistration>();
|
builder.Services.AddScoped<SubmitRegistration>();
|
||||||
builder.Services.AddScoped<ApproveRegistration>();
|
builder.Services.AddScoped<ApproveRegistration>();
|
||||||
builder.Services.AddScoped<BeoordeelRegistratie>();
|
builder.Services.AddScoped<BeoordeelRegistratie>();
|
||||||
|
builder.Services.AddScoped<Werkbak>();
|
||||||
builder.Services.AddScoped<OpenZaakWorker>();
|
builder.Services.AddScoped<OpenZaakWorker>();
|
||||||
builder.Services.AddScoped<OpenZaakJobProcessor>();
|
builder.Services.AddScoped<OpenZaakJobProcessor>();
|
||||||
|
|
||||||
@@ -73,6 +74,12 @@ app.MapPost("/registrations/{id}/decide", async (string id, DecideRequest body,
|
|||||||
return Results.NoContent();
|
return Results.NoContent();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// The behandelaar's werkbak (S-12): the registrations awaiting beoordeling, read from the open
|
||||||
|
// Beoordelen user tasks (§8.2) and enriched with bsn + status. The BFF proxies this behind
|
||||||
|
// medewerker-realm + behandelaar-role authorization; the domain trusts its callers (§8.3).
|
||||||
|
app.MapGet("/behandel/werkbak", async (Werkbak werkbak, CancellationToken ct) =>
|
||||||
|
Results.Ok(await werkbak.GetAsync(ct)));
|
||||||
|
|
||||||
// Read a registration. Its zaak URL appears once the worker has opened the zaak (eventually).
|
// Read a registration. Its zaak URL appears once the worker has opened the zaak (eventually).
|
||||||
app.MapGet("/registrations/{id}", async (string id, IRegistrationStore store, CancellationToken ct) =>
|
app.MapGet("/registrations/{id}", async (string id, IRegistrationStore store, CancellationToken ct) =>
|
||||||
{
|
{
|
||||||
|
|||||||
32
services/domain/Big.Application/Werkbak.cs
Normal file
32
services/domain/Big.Application/Werkbak.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
namespace Big.Application;
|
||||||
|
|
||||||
|
/// <summary>One row of the behandelaar's werkbak: a registration awaiting beoordeling, with the
|
||||||
|
/// public-facing reference (its id) plus the bsn and status a behandelaar needs to triage it.</summary>
|
||||||
|
public sealed record WerkbakItem(string RegistrationId, string Bsn, string Status);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The werkbak query (S-12c): the registrations awaiting a behandelaar's beoordeling. It reads the
|
||||||
|
/// open <c>Beoordelen</c> tasks from the workflow engine (§8.2, via <see cref="IUserTaskClient"/>) —
|
||||||
|
/// the authoritative set of work items — and enriches each with its aggregate (bsn + status). A task
|
||||||
|
/// whose registration the domain doesn't know is skipped rather than invented.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Werkbak(IUserTaskClient tasks, IRegistrationStore store)
|
||||||
|
{
|
||||||
|
public async Task<IReadOnlyList<WerkbakItem>> GetAsync(CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var open = await tasks.GetOpenBeoordelingenAsync(ct);
|
||||||
|
|
||||||
|
var items = new List<WerkbakItem>(open.Count);
|
||||||
|
foreach (var task in open)
|
||||||
|
{
|
||||||
|
var registration = await store.GetAsync(task.RegistrationId, ct);
|
||||||
|
if (registration is null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
items.Add(new WerkbakItem(
|
||||||
|
registration.Id.ToString(), registration.Bsn, registration.Status.ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user