using Big.Domain; namespace Big.Application; /// /// Handles one acquired RegistratieVerlopen external-worker job (S-10a, ADR-0017): load the /// registration the job correlates to and expire it to VERLOPEN — the 30-day document-wait timer fired /// before the documents arrived, so the case is cancelled. Pure application logic over ports; it knows /// nothing of Flowable. The polling loop that feeds it jobs lives in Infrastructure. Mirrors /// . /// public sealed class ExpireRegistrationWorker(IRegistrationStore store) { /// /// Process the job. Idempotent: a redelivered job whose registration is already VERLOPEN is a /// no-op — not persisted again (§8.6, at-least-once delivery). An unknown registration is an error: /// it throws, leaving the job un-completed for Flowable to redeliver. /// public async Task HandleAsync(RegistratieVerlopenJob job, CancellationToken ct = default) { ArgumentNullException.ThrowIfNull(job); var registration = await store.GetAsync(job.RegistrationId, ct) ?? throw new InvalidOperationException( $"No registration {job.RegistrationId} for RegistratieVerlopen job {job.JobId}."); // A redelivered job whose registration is already VERLOPEN completes without persisting again. if (registration.Status == RegistrationStatus.Verlopen) return; registration.Expire(); await store.SaveAsync(registration, ct); } }