From 752064a0b428198bf298f325b5e3e28a56917695 Mon Sep 17 00:00:00 2001 From: Ertugrul Duran Date: Tue, 14 Jul 2026 18:30:49 +0100 Subject: [PATCH] LPT-2258:Adding welshLabel for restrictions --- listing-command/listing-command-api/pom.xml | 2 +- .../listing-command-handler/pom.xml | 2 +- listing-command/pom.xml | 2 +- listing-common/pom.xml | 2 +- .../listing-domain-aggregate/pom.xml | 2 +- listing-domain/listing-domain-common/pom.xml | 2 +- listing-domain/listing-domain-event/pom.xml | 2 +- listing-domain/listing-domain-xhibit/pom.xml | 2 +- listing-domain/pom.xml | 2 +- listing-event-sources/pom.xml | 2 +- listing-event/listing-event-listener/pom.xml | 2 +- listing-event/listing-event-processor/pom.xml | 2 +- listing-event/pom.xml | 2 +- listing-healthchecks/pom.xml | 2 +- listing-integration-test-persistence/pom.xml | 2 +- listing-integration-test/pom.xml | 2 +- .../listing/steps/DailyListPayloadSteps.java | 4 + .../cpp/listing/utils/ReferenceDataStub.java | 15 +++ ...edata.query-result-definitions-by-ids.json | 9 ++ listing-json/pom.xml | 2 +- listing-performance-test/pom.xml | 2 +- listing-query/listing-query-api/pom.xml | 2 +- .../listing/query/api/HearingQueryApi.java | 114 ++++++++++++++++-- .../api/service/ReferenceDataService.java | 12 ++ .../query/api/HearingQueryApiTest.java | 95 +++++++++++++++ .../api/service/ReferenceDataServiceTest.java | 17 +++ listing-query/listing-query-view/pom.xml | 2 +- listing-query/pom.xml | 2 +- listing-service/pom.xml | 2 +- .../listing-viewstore-liquibase/pom.xml | 2 +- .../listing-viewstore-persistence/pom.xml | 2 +- listing-viewstore/pom.xml | 2 +- pom.xml | 2 +- 33 files changed, 282 insertions(+), 36 deletions(-) create mode 100644 listing-integration-test/src/test/resources/stub-data/referencedata.query-result-definitions-by-ids.json diff --git a/listing-command/listing-command-api/pom.xml b/listing-command/listing-command-api/pom.xml index 48ebf427b..45655262b 100644 --- a/listing-command/listing-command-api/pom.xml +++ b/listing-command/listing-command-api/pom.xml @@ -4,7 +4,7 @@ listing-command uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-command/listing-command-handler/pom.xml b/listing-command/listing-command-handler/pom.xml index 6e0124a55..ea1949494 100644 --- a/listing-command/listing-command-handler/pom.xml +++ b/listing-command/listing-command-handler/pom.xml @@ -3,7 +3,7 @@ listing-command uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-command/pom.xml b/listing-command/pom.xml index 06d6f5a8f..ecc4ff4ed 100644 --- a/listing-command/pom.xml +++ b/listing-command/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-common/pom.xml b/listing-common/pom.xml index 8edd8d25e..683db4bbe 100644 --- a/listing-common/pom.xml +++ b/listing-common/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-domain/listing-domain-aggregate/pom.xml b/listing-domain/listing-domain-aggregate/pom.xml index 80b94ff71..0ea69e6ba 100644 --- a/listing-domain/listing-domain-aggregate/pom.xml +++ b/listing-domain/listing-domain-aggregate/pom.xml @@ -3,7 +3,7 @@ listing-domain uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-domain/listing-domain-common/pom.xml b/listing-domain/listing-domain-common/pom.xml index 26fcb2a26..93ab4515a 100644 --- a/listing-domain/listing-domain-common/pom.xml +++ b/listing-domain/listing-domain-common/pom.xml @@ -3,7 +3,7 @@ listing-domain uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-domain/listing-domain-event/pom.xml b/listing-domain/listing-domain-event/pom.xml index 7e7d68c63..df28b4c4e 100644 --- a/listing-domain/listing-domain-event/pom.xml +++ b/listing-domain/listing-domain-event/pom.xml @@ -3,7 +3,7 @@ listing-domain uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-domain/listing-domain-xhibit/pom.xml b/listing-domain/listing-domain-xhibit/pom.xml index 922bed4e3..d66d6a14d 100644 --- a/listing-domain/listing-domain-xhibit/pom.xml +++ b/listing-domain/listing-domain-xhibit/pom.xml @@ -3,7 +3,7 @@ listing-domain uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-domain/pom.xml b/listing-domain/pom.xml index 1907dfb84..4f0fd9a73 100644 --- a/listing-domain/pom.xml +++ b/listing-domain/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT listing-domain diff --git a/listing-event-sources/pom.xml b/listing-event-sources/pom.xml index b7bfd62d2..27cdf8617 100644 --- a/listing-event-sources/pom.xml +++ b/listing-event-sources/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-event/listing-event-listener/pom.xml b/listing-event/listing-event-listener/pom.xml index e72510f00..d08bf6bfe 100644 --- a/listing-event/listing-event-listener/pom.xml +++ b/listing-event/listing-event-listener/pom.xml @@ -3,7 +3,7 @@ listing-event uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-event/listing-event-processor/pom.xml b/listing-event/listing-event-processor/pom.xml index 918a230b4..01f76c76e 100644 --- a/listing-event/listing-event-processor/pom.xml +++ b/listing-event/listing-event-processor/pom.xml @@ -3,7 +3,7 @@ listing-event uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-event/pom.xml b/listing-event/pom.xml index 8d78371a9..44cb0ed0d 100644 --- a/listing-event/pom.xml +++ b/listing-event/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-healthchecks/pom.xml b/listing-healthchecks/pom.xml index 28740830c..d69bf38b3 100644 --- a/listing-healthchecks/pom.xml +++ b/listing-healthchecks/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-integration-test-persistence/pom.xml b/listing-integration-test-persistence/pom.xml index 10bf3104e..59b304244 100644 --- a/listing-integration-test-persistence/pom.xml +++ b/listing-integration-test-persistence/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-integration-test/pom.xml b/listing-integration-test/pom.xml index d5efc1f1e..12609bcc4 100644 --- a/listing-integration-test/pom.xml +++ b/listing-integration-test/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java index d2004d86d..2b5345cb7 100644 --- a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java +++ b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/steps/DailyListPayloadSteps.java @@ -17,6 +17,7 @@ import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataCourtMappings; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataCpCourtRooms; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataJudiciaries; +import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataResultDefinitions; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubGetReferenceDataXhibitCourtRoomMappings; import static uk.gov.moj.cpp.listing.utils.ReferenceDataStub.stubOrganisationUnit; @@ -26,6 +27,7 @@ import uk.gov.moj.cpp.listing.steps.data.UpdatedHearingData; import java.time.LocalTime; +import java.util.UUID; public class DailyListPayloadSteps extends AbstractIT { @@ -34,6 +36,7 @@ public class DailyListPayloadSteps extends AbstractIT { private static final LocalTime DEFAULT_START_TIME = LocalTime.of(10, 0); private static final String EXPECTED_JUDICIARY_NAME = "Recorder Ainsworth judge"; private static final String EXPECTED_PROSECUTOR_ORGANISATION_NAME = "Transport for London"; + private static final UUID JUDICIAL_RESULT_ID = UUID.fromString("065b6fcb-0787-4f0d-a9cd-af4b5c36e047"); private final UpdatedHearingData updatedHearingData; @@ -50,6 +53,7 @@ public DailyListPayloadSteps(final HearingsData hearingsData, final UpdatedHeari stubOrganisationUnit(updatedHearingData.getCourtCentreId()); stubGetReferenceDataJudiciaries(updatedHearingData.getJudiciary().get(0).getJudicialId()); stubGetProsecutorPoliceFlag(hearingsData.getHearingData().get(0).getListedCases().get(0).getAuthorityId()); + stubGetReferenceDataResultDefinitions(JUDICIAL_RESULT_ID); } public void verifyDailyListPayloadContainsHearing(final String publishCourtListType) { diff --git a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/utils/ReferenceDataStub.java b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/utils/ReferenceDataStub.java index 0ce052991..7c49fdef3 100644 --- a/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/utils/ReferenceDataStub.java +++ b/listing-integration-test/src/test/java/uk/gov/moj/cpp/listing/utils/ReferenceDataStub.java @@ -58,6 +58,8 @@ public class ReferenceDataStub { private static final String REFERENCE_DATA_OU_COURTROOMS_MEDIA_TYPE = "application/vnd.referencedata.ou-courtrooms+json"; private static final String REFERENCE_DATA_PROSECUTOR_QUERY_URL = "/referencedata-service/query/api/rest/referencedata/prosecutors/%s"; private static final String REFERENCE_DATA_PROSECUTOR_MEDIA_TYPE = "application/vnd.referencedata.query.prosecutor+json"; + private static final String REFERENCE_DATA_RESULT_DEFINITIONS_URL = "/referencedata-service/query/api/rest/referencedata/result-definitions"; + private static final String REFERENCE_DATA_RESULT_DEFINITIONS_MEDIA_TYPE = "application/vnd.referencedata.query-result-definitions-by-ids+json"; private static final Map COURT_CENTER_IDS = new HashMap<>(){{ put(fromString("9b583616-049b-30f9-a14f-028a53b7cfe8"), "Liverpool Crown Court"); @@ -415,6 +417,19 @@ public static void stubOrganisationUnit(final UUID ouId) { .withBody(payload))); } + public static void stubGetReferenceDataResultDefinitions(final UUID judicialResultId) { + stubPingForReferenceDataService(); + String payload = getPayload("stub-data/referencedata.query-result-definitions-by-ids.json") + .replace("JUDICIAL_RESULT_ID", judicialResultId.toString()); + + stubFor(get(urlPathMatching(REFERENCE_DATA_RESULT_DEFINITIONS_URL)) + .withQueryParam("ids", containing(judicialResultId.toString())) + .willReturn(aResponse().withStatus(SC_OK) + .withHeader("CPPID", randomUUID().toString()) + .withHeader("Content-Type", REFERENCE_DATA_RESULT_DEFINITIONS_MEDIA_TYPE) + .withBody(payload))); + } + public static void stubGetProsecutorPoliceFlag(final UUID prosecutorId) { stubPingForReferenceDataService(); diff --git a/listing-integration-test/src/test/resources/stub-data/referencedata.query-result-definitions-by-ids.json b/listing-integration-test/src/test/resources/stub-data/referencedata.query-result-definitions-by-ids.json new file mode 100644 index 000000000..0d3da743a --- /dev/null +++ b/listing-integration-test/src/test/resources/stub-data/referencedata.query-result-definitions-by-ids.json @@ -0,0 +1,9 @@ +{ + "resultDefinitions": [ + { + "id": "JUDICIAL_RESULT_ID", + "label": "Reporting restriction applied", + "welshLabel": "Cyfyngiad adrodd wedi'i gymhwyso" + } + ] +} diff --git a/listing-json/pom.xml b/listing-json/pom.xml index 00a342618..b9ee38987 100644 --- a/listing-json/pom.xml +++ b/listing-json/pom.xml @@ -4,7 +4,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT listing-json diff --git a/listing-performance-test/pom.xml b/listing-performance-test/pom.xml index 04ae10612..2dfb9e91a 100644 --- a/listing-performance-test/pom.xml +++ b/listing-performance-test/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT listing-performance-test diff --git a/listing-query/listing-query-api/pom.xml b/listing-query/listing-query-api/pom.xml index b4cec39eb..5388e6836 100644 --- a/listing-query/listing-query-api/pom.xml +++ b/listing-query/listing-query-api/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.cpp.listing listing-query - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT listing-query-api diff --git a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java index e73ddf706..2aecb3c72 100644 --- a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java +++ b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java @@ -100,6 +100,12 @@ public class HearingQueryApi { private static final String FULL_NAME = "fullName"; private static final String CASE_IDENTIFIER = "caseIdentifier"; private static final String AUTHORITY_ID = "authorityId"; + private static final String DEFENDANTS = "defendants"; + private static final String OFFENCES = "offences"; + private static final String REPORTING_RESTRICTIONS = "reportingRestrictions"; + private static final String JUDICIAL_RESULT_ID = "judicialResultId"; + private static final String WELSH_LABEL = "welshLabel"; + private static final String RESULT_DEFINITIONS = "resultDefinitions"; @Inject private HearingQueryView hearingQueryView; @@ -267,10 +273,11 @@ public JsonEnvelope getDailyList(final JsonEnvelope query) { final JsonObject responsePayload = response.payloadAsJsonObject(); final Map judiciariesById = resolveJudiciariesById(responsePayload, query); final Map prosecutorOrganisationNamesById = resolveProsecutorOrganisationNames(responsePayload, query); + final Map welshLabelsByResultId = resolveWelshLabelsByResultId(responsePayload, query); final JsonObjectBuilder enrichedBuilder = JsonObjects.createObjectBuilder(); responsePayload.forEach((key, value) -> { if (COURT_LISTS.equals(key)) { - enrichedBuilder.add(COURT_LISTS, enrichCourtListsWithAddress(responsePayload.getJsonArray(COURT_LISTS), address1, address2, welshAddress1, welshAddress2, judiciariesById, prosecutorOrganisationNamesById)); + enrichedBuilder.add(COURT_LISTS, enrichCourtListsWithAddress(responsePayload.getJsonArray(COURT_LISTS), address1, address2, welshAddress1, welshAddress2, judiciariesById, prosecutorOrganisationNamesById, welshLabelsByResultId)); } else { enrichedBuilder.add(key, value); } @@ -296,7 +303,7 @@ public JsonEnvelope getDailyList(final JsonEnvelope query) { return envelopeFrom(metadataFrom(query.metadata()).withName("listing.search.daily.list.payload"), enrichedBuilder.build()); } - private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final String address1, final String address2, final String welshAddress1, final String welshAddress2, final Map judiciariesById, final Map prosecutorOrganisationNamesById) { + private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final String address1, final String address2, final String welshAddress1, final String welshAddress2, final Map judiciariesById, final Map prosecutorOrganisationNamesById, final Map welshLabelsByResultId) { final JsonArrayBuilder enrichedCourtListsBuilder = createArrayBuilder(); courtLists.getValuesAs(JsonObject.class).forEach(courtList -> { final JsonObject crestCourtSite = courtList.getJsonObject(CREST_COURT_SITE); @@ -319,7 +326,7 @@ private JsonArray enrichCourtListsWithAddress(final JsonArray courtLists, final if (CREST_COURT_SITE.equals(key)) { enrichedCourtListBuilder.add(CREST_COURT_SITE, enrichedSiteBuilder.build()); } else if (SITTINGS.equals(key)) { - enrichedCourtListBuilder.add(SITTINGS, enrichSittings(courtList.getJsonArray(SITTINGS), judiciariesById, prosecutorOrganisationNamesById)); + enrichedCourtListBuilder.add(SITTINGS, enrichSittings(courtList.getJsonArray(SITTINGS), judiciariesById, prosecutorOrganisationNamesById, welshLabelsByResultId)); } else { enrichedCourtListBuilder.add(key, value); } @@ -353,6 +360,43 @@ private Map resolveJudiciariesById(final JsonObject response .collect(Collectors.toMap(judge -> judge.getString(ID), judge -> judge)); } + private Map resolveWelshLabelsByResultId(final JsonObject responsePayload, final JsonEnvelope query) { + if (!responsePayload.containsKey(COURT_LISTS)) { + return Map.of(); + } + + final List judicialResultIds = responsePayload.getJsonArray(COURT_LISTS).getValuesAs(JsonObject.class).stream() + .filter(courtList -> courtList.containsKey(SITTINGS)) + .flatMap(courtList -> courtList.getJsonArray(SITTINGS).getValuesAs(JsonObject.class).stream()) + .filter(sitting -> sitting.containsKey(HEARINGS)) + .flatMap(sitting -> sitting.getJsonArray(HEARINGS).getValuesAs(JsonObject.class).stream()) + .filter(hearing -> hearing.containsKey(DEFENDANTS)) + .flatMap(hearing -> hearing.getJsonArray(DEFENDANTS).getValuesAs(JsonObject.class).stream()) + .filter(defendant -> defendant.containsKey(OFFENCES)) + .flatMap(defendant -> defendant.getJsonArray(OFFENCES).getValuesAs(JsonObject.class).stream()) + .filter(offence -> offence.containsKey(REPORTING_RESTRICTIONS)) + .flatMap(offence -> offence.getJsonArray(REPORTING_RESTRICTIONS).getValuesAs(JsonObject.class).stream()) + .filter(reportingRestriction -> reportingRestriction.containsKey(JUDICIAL_RESULT_ID)) + .map(reportingRestriction -> reportingRestriction.getString(JUDICIAL_RESULT_ID)) + .distinct() + .collect(Collectors.toList()); + + if (judicialResultIds.isEmpty()) { + return Map.of(); + } + + final JsonObject resultDefinitionsPayload = referenceDataService.getResultDefinitionsByIdList( + judicialResultIds.stream().map(UUID::fromString).collect(Collectors.toList()), query).payloadAsJsonObject(); + + final Map welshLabelsByResultId = new HashMap<>(); + resultDefinitionsPayload.getJsonArray(RESULT_DEFINITIONS).getValuesAs(JsonObject.class).forEach(resultDefinition -> { + if (resultDefinition.containsKey(WELSH_LABEL)) { + welshLabelsByResultId.put(resultDefinition.getString(ID), resultDefinition.getString(WELSH_LABEL)); + } + }); + return welshLabelsByResultId; + } + private Map resolveProsecutorOrganisationNames(final JsonObject responsePayload, final JsonEnvelope query) { if (!responsePayload.containsKey(COURT_LISTS)) { return Map.of(); @@ -411,7 +455,7 @@ private static String resolveOrganisationName(final Map prosecut return authorityId != null ? prosecutorOrganisationNamesById.get(authorityId) : null; } - private JsonArray enrichSittings(final JsonArray sittings, final Map judiciariesById, final Map prosecutorOrganisationNamesById) { + private JsonArray enrichSittings(final JsonArray sittings, final Map judiciariesById, final Map prosecutorOrganisationNamesById, final Map welshLabelsByResultId) { final JsonArrayBuilder enrichedSittingsBuilder = createArrayBuilder(); sittings.getValuesAs(JsonObject.class).forEach(sitting -> { final JsonObjectBuilder enrichedSittingBuilder = JsonObjects.createObjectBuilder(); @@ -419,7 +463,7 @@ private JsonArray enrichSittings(final JsonArray sittings, final Map prosecutorOrganisationNamesById) { + private JsonArray enrichHearingsWithProsecutorOrganisationNames(final JsonArray hearings, final Map prosecutorOrganisationNamesById, final Map welshLabelsByResultId) { final JsonArrayBuilder enrichedHearingsBuilder = createArrayBuilder(); hearings.getValuesAs(JsonObject.class) - .forEach(hearing -> enrichedHearingsBuilder.add(enrichHearingWithProsecutorOrganisationName(hearing, prosecutorOrganisationNamesById))); + .forEach(hearing -> enrichedHearingsBuilder.add(enrichHearingWithProsecutorOrganisationName(hearing, prosecutorOrganisationNamesById, welshLabelsByResultId))); return enrichedHearingsBuilder.build(); } - private JsonObject enrichHearingWithProsecutorOrganisationName(final JsonObject hearing, final Map prosecutorOrganisationNamesById) { + private JsonObject enrichHearingWithProsecutorOrganisationName(final JsonObject hearing, final Map prosecutorOrganisationNamesById, final Map welshLabelsByResultId) { final boolean hasProsecutor = hearing.containsKey(PROSECUTOR); final String authorityId = getAuthorityId(hearing); final String prosecutorId = hasProsecutor ? getProsecutorId(hearing.getJsonObject(PROSECUTOR)) : null; @@ -444,7 +488,11 @@ private JsonObject enrichHearingWithProsecutorOrganisationName(final JsonObject final JsonObjectBuilder enrichedHearingBuilder = JsonObjects.createObjectBuilder(); hearing.forEach((key, value) -> { - if (!PROSECUTOR.equals(key)) { + if (PROSECUTOR.equals(key)) { + // handled below + } else if (DEFENDANTS.equals(key)) { + enrichedHearingBuilder.add(DEFENDANTS, enrichDefendantsWithWelshReportingRestrictionLabels(hearing.getJsonArray(DEFENDANTS), welshLabelsByResultId)); + } else { enrichedHearingBuilder.add(key, value); } }); @@ -456,6 +504,52 @@ private JsonObject enrichHearingWithProsecutorOrganisationName(final JsonObject return enrichedHearingBuilder.build(); } + private JsonArray enrichDefendantsWithWelshReportingRestrictionLabels(final JsonArray defendants, final Map welshLabelsByResultId) { + final JsonArrayBuilder enrichedDefendantsBuilder = createArrayBuilder(); + defendants.getValuesAs(JsonObject.class).forEach(defendant -> { + final JsonObjectBuilder enrichedDefendantBuilder = JsonObjects.createObjectBuilder(); + defendant.forEach((key, value) -> { + if (OFFENCES.equals(key)) { + enrichedDefendantBuilder.add(OFFENCES, enrichOffencesWithWelshReportingRestrictionLabels(defendant.getJsonArray(OFFENCES), welshLabelsByResultId)); + } else { + enrichedDefendantBuilder.add(key, value); + } + }); + enrichedDefendantsBuilder.add(enrichedDefendantBuilder.build()); + }); + return enrichedDefendantsBuilder.build(); + } + + private JsonArray enrichOffencesWithWelshReportingRestrictionLabels(final JsonArray offences, final Map welshLabelsByResultId) { + final JsonArrayBuilder enrichedOffencesBuilder = createArrayBuilder(); + offences.getValuesAs(JsonObject.class).forEach(offence -> { + final JsonObjectBuilder enrichedOffenceBuilder = JsonObjects.createObjectBuilder(); + offence.forEach((key, value) -> { + if (REPORTING_RESTRICTIONS.equals(key)) { + enrichedOffenceBuilder.add(REPORTING_RESTRICTIONS, enrichReportingRestrictionsWithWelshLabel(offence.getJsonArray(REPORTING_RESTRICTIONS), welshLabelsByResultId)); + } else { + enrichedOffenceBuilder.add(key, value); + } + }); + enrichedOffencesBuilder.add(enrichedOffenceBuilder.build()); + }); + return enrichedOffencesBuilder.build(); + } + + private JsonArray enrichReportingRestrictionsWithWelshLabel(final JsonArray reportingRestrictions, final Map welshLabelsByResultId) { + final JsonArrayBuilder enrichedReportingRestrictionsBuilder = createArrayBuilder(); + reportingRestrictions.getValuesAs(JsonObject.class).forEach(reportingRestriction -> { + final JsonObjectBuilder enrichedReportingRestrictionBuilder = JsonObjects.createObjectBuilder(); + reportingRestriction.forEach(enrichedReportingRestrictionBuilder::add); + final String welshLabel = welshLabelsByResultId.get(reportingRestriction.getString(JUDICIAL_RESULT_ID, null)); + if (welshLabel != null) { + enrichedReportingRestrictionBuilder.add(WELSH_LABEL, welshLabel); + } + enrichedReportingRestrictionsBuilder.add(enrichedReportingRestrictionBuilder.build()); + }); + return enrichedReportingRestrictionsBuilder.build(); + } + private static String getProsecutorId(final JsonObject prosecutor) { return prosecutor.containsKey(PROSECUTOR_ID) ? prosecutor.getString(PROSECUTOR_ID) : null; } @@ -572,7 +666,7 @@ private JsonEnvelope processGetCaseByDefendant(final JsonObject payload, final S .map(UUID::fromString) .collect(Collectors.toList()); - final List defendants = payload.getJsonArray("defendants").stream() + final List defendants = payload.getJsonArray(DEFENDANTS).stream() .map(JsonString.class::cast) .map(JsonString::getString) .map(UUID::fromString) diff --git a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java index 3196aad00..e08d91c8d 100644 --- a/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java +++ b/listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataService.java @@ -37,6 +37,7 @@ public class ReferenceDataService { private static final String REFERENCEDATA_QUERY_HEARING_TYPES = "referencedata.query.hearing-types"; private static final String WELSH_HEARING_DESCRIPTION = "welshHearingDescription"; private static final String REFERENCEDATA_QUERY_PROSECUTOR = "referencedata.query.prosecutor"; + private static final String REFERENCEDATA_QUERY_RESULT_DEFINITIONS_BY_IDS = "referencedata.query-result-definitions-by-ids"; @Inject private Enveloper enveloper; @@ -67,6 +68,17 @@ public JsonEnvelope getJudiciariesByIdList(final List judiciaryIds, final return requester.requestAsAdmin(envelopeFrom(requestEnvelope.metadata(), requestEnvelope.payload())); } + public JsonEnvelope getResultDefinitionsByIdList(final List resultDefinitionIds, final JsonEnvelope event) { + final JsonObject payload = createObjectBuilder().add("ids", resultDefinitionIds.stream().map(UUID::toString).collect(Collectors.joining(","))).build(); + LOGGER.info("'referencedata.query-result-definitions-by-ids' request with payload {}", payload); + + final Envelope requestEnvelope = Enveloper.envelop(payload) + .withName(REFERENCEDATA_QUERY_RESULT_DEFINITIONS_BY_IDS) + .withMetadataFrom(event); + + return requester.requestAsAdmin(envelopeFrom(requestEnvelope.metadata(), requestEnvelope.payload())); + } + public JsonEnvelope getProsecutorById(final String prosecutorId, final JsonEnvelope event) { final JsonObject payload = createObjectBuilder().add("id", prosecutorId).build(); LOGGER.info("'referencedata.query.prosecutor' request with payload {}", payload); diff --git a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java index acee064ec..d20de0ba3 100644 --- a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java +++ b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java @@ -1017,6 +1017,101 @@ void shouldGetDailyListWithJudiciaryName() { assertThat(enrichedJudiciary.getString("welshJudiciaryName"), is(welshJudiciaryName)); } + @Test + void shouldGetDailyListWithReportingRestrictionWelshLabel() { + final String courtCentreId = randomUUID().toString(); + final String startDate = "2026-05-07"; + final String publishCourtListType = "FINAL"; + final String judicialResultId = randomUUID().toString(); + final String label = "Reporting restriction applies"; + final String welshLabel = "Mae cyfyngiad adrodd yn berthnasol"; + + final JsonEnvelope query = envelopeFrom( + metadataBuilder() + .withId(randomUUID()) + .withName("listing.search.daily.list.payload"), + createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("startDate", startDate) + .add("publishCourtListType", publishCourtListType) + .build()); + + final JsonObject reportingRestriction = createObjectBuilder() + .add("judicialResultId", judicialResultId) + .add("label", label) + .build(); + + final JsonObject offence = createObjectBuilder() + .add("offenceCode", "TH001") + .add("reportingRestrictions", createArrayBuilder().add(reportingRestriction).build()) + .build(); + + final JsonObject defendant = createObjectBuilder() + .add("id", randomUUID().toString()) + .add("offences", createArrayBuilder().add(offence).build()) + .build(); + + final JsonObject hearing = createObjectBuilder() + .add("startTime", "2026-05-07T10:00:00") + .add("defendants", createArrayBuilder().add(defendant).build()) + .build(); + + final JsonObject sitting = createObjectBuilder() + .add("sittingDate", startDate) + .add("judiciary", createArrayBuilder().build()) + .add("hearings", createArrayBuilder().add(hearing).build()) + .build(); + + final JsonObject courtListPayload = createObjectBuilder() + .add("courtCentreId", courtCentreId) + .add("courtLists", createArrayBuilder() + .add(createObjectBuilder() + .add("crestCourtSite", createObjectBuilder() + .add("crestCourtSiteId", "415") + .add("crestCourtSiteName", "Kingston Crown Court") + .add("courtType", "CROWN") + .build()) + .add("sittings", createArrayBuilder().add(sitting).build()) + .build()) + .build()) + .build(); + + final JsonEnvelope courtListResponse = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("listing.courtlist"), + courtListPayload); + + final JsonObject courtCentreEnvelopePayload = createObjectBuilder().add("isWelsh", false).build(); + final JsonEnvelope courtCentreEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query.courtroom"), + courtCentreEnvelopePayload); + + final JsonObject resultDefinitionsReferenceData = createObjectBuilder() + .add("resultDefinitions", createArrayBuilder() + .add(createObjectBuilder().add("id", judicialResultId).add("welshLabel", welshLabel).build()) + .build()) + .build(); + final JsonEnvelope resultDefinitionsReferenceDataEnvelope = envelopeFrom( + metadataBuilder().withId(randomUUID()).withName("referencedata.query-result-definitions-by-ids"), + resultDefinitionsReferenceData); + + when(hearingQueryView.retrieveCourtList(any(JsonEnvelope.class))).thenReturn(courtListResponse); + when(referenceDataService.isHearingLanguageWelsh(any(), eq(courtCentreId))).thenReturn(Optional.of(false)); + when(referenceDataService.getCourtCentreById(any(UUID.class), any(JsonEnvelope.class))).thenReturn(courtCentreEnvelope); + when(referenceDataService.getResultDefinitionsByIdList(eq(List.of(fromString(judicialResultId))), any(JsonEnvelope.class))).thenReturn(resultDefinitionsReferenceDataEnvelope); + + final JsonObject resultPayload = hearingQueryApi.getDailyList(query).payloadAsJsonObject(); + + final JsonObject enrichedReportingRestriction = resultPayload.getJsonArray("courtLists").getJsonObject(0) + .getJsonArray("sittings").getJsonObject(0) + .getJsonArray("hearings").getJsonObject(0) + .getJsonArray("defendants").getJsonObject(0) + .getJsonArray("offences").getJsonObject(0) + .getJsonArray("reportingRestrictions").getJsonObject(0); + + assertThat(enrichedReportingRestriction.getString("label"), is(label)); + assertThat(enrichedReportingRestriction.getString("welshLabel"), is(welshLabel)); + } + @Test void shouldGetDailyListWithProsecutorOrganisationName() { final String courtCentreId = randomUUID().toString(); diff --git a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java index 07e404009..3f1ba1e52 100644 --- a/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java +++ b/listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/service/ReferenceDataServiceTest.java @@ -96,6 +96,23 @@ public void shouldGetJudiciariesByIdList() { assertThat(requestEnvelope.metadata().name(), is("referencedata.query.judiciaries")); } + @Test + public void shouldGetResultDefinitionsByIdList() { + final JsonEnvelope eventEnvelope = generateEmptyEnvelope(); + + final UUID resultDefinitionId = randomUUID(); + + referenceDataService.getResultDefinitionsByIdList(asList(resultDefinitionId), eventEnvelope); + + verify(requester).requestAsAdmin(argumentCaptorForRequestEnvelope.capture()); + final JsonEnvelope requestEnvelope = argumentCaptorForRequestEnvelope.getValue(); + assertThat(requestEnvelope.metadata().name(), is("referencedata.query-result-definitions-by-ids")); + final JsonObject expectedPayload = createObjectBuilder() + .add("ids", resultDefinitionId.toString()) + .build(); + assertThat(requestEnvelope.payloadAsJsonObject(), is(expectedPayload)); + } + @Test public void shouldGetProsecutorById() { final JsonEnvelope eventEnvelope = generateEmptyEnvelope(); diff --git a/listing-query/listing-query-view/pom.xml b/listing-query/listing-query-view/pom.xml index e0d5e06f1..48648441b 100644 --- a/listing-query/listing-query-view/pom.xml +++ b/listing-query/listing-query-view/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.cpp.listing listing-query - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT listing-query-view diff --git a/listing-query/pom.xml b/listing-query/pom.xml index 8d5f20494..535da8a63 100644 --- a/listing-query/pom.xml +++ b/listing-query/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-service/pom.xml b/listing-service/pom.xml index bee778b20..ee5d3806b 100644 --- a/listing-service/pom.xml +++ b/listing-service/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-viewstore/listing-viewstore-liquibase/pom.xml b/listing-viewstore/listing-viewstore-liquibase/pom.xml index 1ed328104..97eada46e 100644 --- a/listing-viewstore/listing-viewstore-liquibase/pom.xml +++ b/listing-viewstore/listing-viewstore-liquibase/pom.xml @@ -3,7 +3,7 @@ listing-viewstore uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-viewstore/listing-viewstore-persistence/pom.xml b/listing-viewstore/listing-viewstore-persistence/pom.xml index c27fdd587..1eee6d214 100644 --- a/listing-viewstore/listing-viewstore-persistence/pom.xml +++ b/listing-viewstore/listing-viewstore-persistence/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.listing listing-viewstore - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/listing-viewstore/pom.xml b/listing-viewstore/pom.xml index 66a254739..a96f25dbc 100644 --- a/listing-viewstore/pom.xml +++ b/listing-viewstore/pom.xml @@ -3,7 +3,7 @@ listing-parent uk.gov.moj.cpp.listing - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 1bd400a65..94415a2a6 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ uk.gov.moj.cpp.listing listing-parent - 17.104.8-cct-1981-SNAPSHOT + 17.104.9-cct-1981-SNAPSHOT pom Listing Context Microservice Parent