using Big.Domain; namespace Big.Application; /// A zorgprofessional's request to withdraw their own registration ("trek aanvraag in"). public sealed record WithdrawRegistrationCommand(RegistrationId RegistrationId); /// /// The withdrawal use case (S-11): a zorgprofessional pulls a still-open registration back. It /// advances the aggregate to INGETROKKEN, persists it, then cancels the running registratie process /// by correlating the withdrawal message to its instance (ADR-0014), so the case leaves the /// behandelaar's werkbak. Idempotent — a repeated or redelivered withdrawal of an already-withdrawn /// registration is a no-op (not persisted or cancelled again). Cancelling is best-effort: if the /// registration never started a process the withdrawal still stands (the process cancel is skipped), /// mirroring how completes its task best-effort. /// public sealed class WithdrawRegistration(IRegistrationStore store, IWorkflowClient workflow) { public async Task HandleAsync(WithdrawRegistrationCommand command, CancellationToken ct = default) { ArgumentNullException.ThrowIfNull(command); var registration = await store.GetAsync(command.RegistrationId, ct) ?? throw new InvalidOperationException($"No registration {command.RegistrationId} to withdraw."); // A repeated withdrawal is a no-op: don't persist or cancel the already-withdrawn one again. if (registration.Status == RegistrationStatus.Ingetrokken) return; registration.Withdraw(); await store.SaveAsync(registration, ct); // Cancel the running process (if one was started) so its Beoordelen task leaves the werkbak. if (registration.ProcessInstanceId is not null) await workflow.WithdrawProcessAsync(registration.ProcessInstanceId, ct); } }