using Big.Domain; namespace Big.Application; /// A zorgprofessional's signal that they have supplied the documents their registration is /// waiting for ("documenten aanleveren"). is the authenticated caller (from the /// DigiD token, forwarded by the BFF): only the registration's own bsn may provide its documents. public sealed record ProvideDocumentsCommand(RegistrationId RegistrationId, string Bsn); /// The outcome of a provide-documents request. public enum ProvideDocumentsOutcome { /// The documents were accepted; the process's document wait was completed (if any). Accepted, /// No registration with that id belongs to the caller — unknown, or owned by someone else /// (the two are deliberately indistinguishable, so the endpoint reveals neither). NotFound, } /// /// The provide-documents use case (S-10a): a zorgprofessional supplies the documents their registration /// is parked waiting for, completing the WachtOpDocumenten task so the registratie process leaves the /// 30-day wait and continues to beoordeling (ADR-0017). Owner-scoped by bsn. Completing the wait is /// best-effort: if the registration never started a process (or already left the wait), the request /// still stands, mirroring how cancels best-effort. The actual file /// upload and its ZGW storage via the ACL is S-10b; this is the trigger that unblocks the process. /// public sealed class ProvideDocuments(IRegistrationStore store, IWorkflowClient workflow) { public async Task HandleAsync(ProvideDocumentsCommand command, CancellationToken ct = default) { ArgumentNullException.ThrowIfNull(command); var registration = await store.GetAsync(command.RegistrationId, ct); // Unknown, or not the caller's registration: report NotFound either way (don't reveal which). if (registration is null || registration.Bsn != command.Bsn) return ProvideDocumentsOutcome.NotFound; // Complete the document wait (if a process is running) so beoordeling can proceed. if (registration.ProcessInstanceId is not null) await workflow.CompleteDocumentWaitAsync(registration.ProcessInstanceId, ct); return ProvideDocumentsOutcome.Accepted; } }