using New.Application.Worklist; namespace New.Api.Contracts; /// /// Builds the presentation-only `actions`/`seams` blocks on top of a /// CaseDetail read model. This is deliberately New.Api's job, not the /// resolver's or either source's - it's about which endpoints exist, which /// is an API-shape concern, not a data-source concern. /// internal static class CaseDetailResponseFactory { public static CaseDetailResponse From(CaseDetail detail) { var actions = detail.Origin == WorklistOrigin.Legacy ? BuildLegacyActions(detail.LegacyAanvraagId!.Value) : BuildOwnedActions(detail.RegistrationApplicationId!.Value); var seams = detail.Origin == WorklistOrigin.Legacy ? new Dictionary { ["aanvrager"] = "legacy-backend", ["procestijdlijn"] = null } : new Dictionary { ["aanvrager"] = "owned", ["procestijdlijn"] = "case-framework-timeline" }; return new CaseDetailResponse( detail.Origin.ToString(), detail.LegacyAanvraagId, detail.RegistrationApplicationId, detail.Surname, detail.Initials, detail.Bsn, AddressResponse.From(detail.Address), detail.Email, detail.Phone, detail.PreferredChannel, detail.DiplomaCode, detail.DiplomaCountryOfIssue, detail.DiplomaIssuedOn, detail.ReceivedOn, AssessmentResponse.From(detail.Assessment), detail.ProcessStatus, detail.LastModifiedAt, actions, seams); } private static CaseDetailActions BuildLegacyActions(int aanvraagId) => new( EditApplicantDetails: new ActionLink("writeThrough", $"/api/worklist/legacy/{aanvraagId}/details"), RecordAssessment: new ActionLink("redirect", $"/legacy/aanvraag/{aanvraagId}/beoordeling"), TakeOwnership: new ActionLink("transition", $"/api/worklist/legacy/{aanvraagId}/take-ownership")); private static CaseDetailActions BuildOwnedActions(Guid registrationApplicationId) => new( EditApplicantDetails: new ActionLink("owned", $"/api/worklist/owned/{registrationApplicationId}/details"), RecordAssessment: new ActionLink("owned", $"/api/worklist/owned/{registrationApplicationId}/assessment"), ReleaseOwnership: new ActionLink("transition", $"/api/worklist/owned/{registrationApplicationId}/ownership")); }