Skip to content

Commit 65e38bc

Browse files
LPT-2323 coming from hmcts/cpp-context-listing-archived@1e61219 to support alphabetical list generation (#16)
Co-authored-by: Arcadius Ahouansou <arcadius@menelic.com>
1 parent fdf17e3 commit 65e38bc

2 files changed

Lines changed: 103 additions & 4 deletions

File tree

listing-query/listing-query-api/src/main/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApi.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import static uk.gov.justice.services.messaging.Envelope.metadataFrom;
1010
import static uk.gov.justice.services.messaging.JsonEnvelope.envelopeFrom;
1111
import static uk.gov.justice.services.messaging.JsonObjects.createObjectBuilderWithFilter;
12+
import static uk.gov.moj.cpp.listing.domain.CourtListType.ALPHABETICAL;
13+
import static uk.gov.moj.cpp.listing.domain.CourtListType.JUDGE;
1214
import static uk.gov.moj.cpp.listing.domain.CourtListType.ONLINE_PUBLIC;
1315
import static uk.gov.moj.cpp.listing.domain.CourtListType.PUBLIC;
1416

@@ -25,7 +27,9 @@
2527
import uk.gov.moj.cpp.listing.common.xhibit.ReferenceDataLoader;
2628
import uk.gov.moj.cpp.listing.domain.CourtListType;
2729
import uk.gov.moj.cpp.listing.domain.referencedata.OrganisationUnit;
30+
import uk.gov.moj.cpp.listing.query.api.service.AlphabeticalCourtListService;
2831
import uk.gov.moj.cpp.listing.query.api.service.ReferenceDataService;
32+
import uk.gov.moj.cpp.listing.query.document.generator.JudgeListTemplateAssembler;
2933
import uk.gov.moj.cpp.listing.query.document.generator.StandardPublicCourtListTemplateAssembler;
3034
import uk.gov.moj.cpp.listing.query.view.HearingQueryView;
3135
import uk.gov.moj.cpp.listing.query.view.service.ProgressionService;
@@ -63,6 +67,7 @@ public class HearingQueryApi {
6367
public static final String RESTRICTED = "restricted";
6468
public static final String INCLUDE_APPLICATIONS = "includeApplications";
6569
private static final String LIST_ID = "listId";
70+
private static final String START_DATE = "startDate";
6671
private static final String OU_L2_CODE = "oucodeL2Code";
6772
private static final String FIRST_NAME = "firstName";
6873
private static final String LAST_NAME = "lastName";
@@ -86,6 +91,12 @@ public class HearingQueryApi {
8691
@Inject
8792
private StandardPublicCourtListTemplateAssembler standardPublicCourtListAssembler;
8893

94+
@Inject
95+
private AlphabeticalCourtListService alphabeticalCourtListService;
96+
97+
@Inject
98+
private JudgeListTemplateAssembler judgeListTemplateAssembler;
99+
89100
@Inject
90101
private ReferenceDataService referenceDataService;
91102

@@ -165,18 +176,23 @@ public JsonEnvelope searchHearingsForCourtListPayload(final JsonEnvelope query)
165176

166177
final String courtCentreId = query.payloadAsJsonObject().getString(COURT_CENTRE_ID, null);
167178
final String courtRoomId = query.payloadAsJsonObject().getString(COURT_ROOM_ID, null);
179+
final String startDate = query.payloadAsJsonObject().getString(START_DATE, null);
168180
final String listId = query.payloadAsJsonObject().getString(LIST_ID);
169181
final boolean restricted = Optional.ofNullable(query.payloadAsJsonObject().get(RESTRICTED)).map(restrictedJson -> Boolean.valueOf(restrictedJson.toString())).orElse(false);
170182
final boolean includeApplications = Optional.ofNullable(query.payloadAsJsonObject().get(INCLUDE_APPLICATIONS)).map(includeApplicationsJson -> Boolean.valueOf(includeApplicationsJson.toString())).orElse(false);
171183
final Optional<CourtListType> courtListType = CourtListType.valueFor(listId);
172184

173185
if(courtListType.isPresent()) {
174-
final JsonEnvelope queryResponse = hearingQueryView.getCourtListContent(query);
175-
final Optional<JsonObject> courtListData = standardPublicCourtListAssembler.assemble(queryResponse, courtCentreId, courtRoomId, courtListType.get(), restricted, includeApplications);
186+
final CourtListType listType = courtListType.get();
187+
// JUDGE uses a different query (range search by judge); all other types use the standard court list content.
188+
final JsonEnvelope queryResponse = JUDGE.equals(listType)
189+
? hearingQueryView.rangeSearchHearingsForJudge(query)
190+
: hearingQueryView.getCourtListContent(query);
191+
final Optional<JsonObject> courtListData = buildCourtListData(queryResponse, courtCentreId, courtRoomId, listType, restricted, includeApplications, startDate);
176192
if (courtListData.isPresent()) {
177193
final JsonObject courtListPayload = courtListData.get();
178194
final boolean isWelsh = referenceDataService.isHearingLanguageWelsh(queryResponse, courtCentreId).orElse(false);
179-
final String templateName = getTemplateName(courtListType.get(), isWelsh);
195+
final String templateName = getTemplateName(listType, isWelsh);
180196
final JsonObjectBuilder builder = JsonObjects.createObjectBuilder();
181197
courtListPayload.forEach(builder::add);
182198
builder.add("templateName", templateName);
@@ -290,8 +306,25 @@ private JsonEnvelope processGetCaseByDefendant(final JsonObject payload, final S
290306
return this.hearingQueryView.getCasesByDefendantAndHearingDate(caseIds, defendants, hearingDate, query);
291307
}
292308

309+
/**
310+
* Builds the court list payload for the given type, routing ALPHABETICAL and JUDGE to their dedicated
311+
* assemblers (mirroring the binary /courtlist endpoint). Without this, those types fall through to the
312+
* standard assembler and yield an empty payload.
313+
*/
314+
private Optional<JsonObject> buildCourtListData(final JsonEnvelope queryResponse, final String courtCentreId, final String courtRoomId,
315+
final CourtListType courtListType, final boolean restricted,
316+
final boolean includeApplications, final String startDate) {
317+
if (ALPHABETICAL.equals(courtListType)) {
318+
return alphabeticalCourtListService.buildAlphabeticalCourtListData(queryResponse, courtCentreId);
319+
}
320+
if (JUDGE.equals(courtListType)) {
321+
return judgeListTemplateAssembler.assemble(queryResponse, courtCentreId, courtRoomId, courtListType, startDate);
322+
}
323+
return standardPublicCourtListAssembler.assemble(queryResponse, courtCentreId, courtRoomId, courtListType, restricted, includeApplications);
324+
}
325+
293326
private String getTemplateName(final CourtListType courtListType, boolean welsh) {
294-
if ((PUBLIC.equals(courtListType) || ONLINE_PUBLIC.equals(courtListType)) && welsh) {
327+
if ((ALPHABETICAL.equals(courtListType) || PUBLIC.equals(courtListType) || ONLINE_PUBLIC.equals(courtListType)) && welsh) {
295328
return courtListType.getWelshTemplateName();
296329
}
297330
return courtListType.getTemplateName();

listing-query/listing-query-api/src/test/java/uk/gov/moj/cpp/listing/query/api/HearingQueryApiTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
import static org.junit.jupiter.api.Assertions.assertSame;
2020
import static org.junit.jupiter.api.Assertions.assertThrows;
2121
import static org.mockito.ArgumentMatchers.any;
22+
import static org.mockito.ArgumentMatchers.anyBoolean;
2223
import static org.mockito.ArgumentMatchers.eq;
2324
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.never;
2426
import static org.mockito.Mockito.verify;
2527
import static org.mockito.Mockito.when;
2628
import static uk.gov.justice.services.messaging.JsonEnvelope.envelopeFrom;
@@ -31,6 +33,8 @@
3133
import static uk.gov.justice.services.test.utils.core.matchers.JsonEnvelopeMatcher.jsonEnvelope;
3234
import static uk.gov.justice.services.test.utils.core.matchers.JsonEnvelopeMetadataMatcher.metadata;
3335
import static uk.gov.justice.services.test.utils.core.matchers.JsonEnvelopePayloadMatcher.payloadIsJson;
36+
import static uk.gov.moj.cpp.listing.domain.CourtListType.ALPHABETICAL;
37+
import static uk.gov.moj.cpp.listing.domain.CourtListType.JUDGE;
3438
import static uk.gov.moj.cpp.listing.domain.CourtListType.ONLINE_PUBLIC;
3539
import static uk.gov.moj.cpp.listing.domain.CourtListType.PRISON;
3640
import static uk.gov.moj.cpp.listing.domain.CourtListType.PUBLIC;
@@ -49,8 +53,10 @@
4953
import uk.gov.moj.cpp.listing.common.xhibit.ReferenceDataLoader;
5054
import uk.gov.moj.cpp.listing.domain.CourtListType;
5155
import uk.gov.moj.cpp.listing.domain.referencedata.OrganisationUnit;
56+
import uk.gov.moj.cpp.listing.query.api.service.AlphabeticalCourtListService;
5257
import uk.gov.moj.cpp.listing.query.api.service.ReferenceDataService;
5358
import uk.gov.moj.cpp.listing.query.api.util.FileUtil;
59+
import uk.gov.moj.cpp.listing.query.document.generator.JudgeListTemplateAssembler;
5460
import uk.gov.moj.cpp.listing.query.document.generator.StandardPublicCourtListTemplateAssembler;
5561
import uk.gov.moj.cpp.listing.query.view.HearingQueryView;
5662
import uk.gov.moj.cpp.listing.query.view.service.ProgressionService;
@@ -117,6 +123,12 @@ public class HearingQueryApiTest {
117123
@Mock
118124
private StandardPublicCourtListTemplateAssembler standardPublicCourtListAssembler;
119125

126+
@Mock
127+
private AlphabeticalCourtListService alphabeticalCourtListService;
128+
129+
@Mock
130+
private JudgeListTemplateAssembler judgeListTemplateAssembler;
131+
120132
@Mock
121133
private ReferenceDataService referenceDataService;
122134

@@ -329,6 +341,60 @@ public void shouldReturnPayloadWithTemplateNameWhenUshersMagistrateList() {
329341
assertThat(returnedEnvelope.payloadAsJsonObject().getString("templateName"), is("UshersMagistrateList"));
330342
}
331343

344+
@Test
345+
public void shouldRouteAlphabeticalToAlphabeticalServiceAndReturnCourtListTemplate() {
346+
final JsonEnvelope query = envelopeFrom(
347+
metadataBuilder()
348+
.withId(fromString("6d4ced64-b058-4bd4-a652-98d8230b92a5"))
349+
.withName("listing.search.court.list.payload"),
350+
createObjectBuilder()
351+
.add(COURT_CENTRE_ID, randomUUID().toString())
352+
.add(COURT_ROOM_ID, randomUUID().toString())
353+
.add(LIST_ID, ALPHABETICAL.toString())
354+
.build());
355+
356+
final JsonEnvelope courtListContent = mock(JsonEnvelope.class);
357+
when(hearingQueryView.getCourtListContent(query)).thenReturn(courtListContent);
358+
when(alphabeticalCourtListService.buildAlphabeticalCourtListData(any(JsonEnvelope.class), any(String.class)))
359+
.thenReturn(Optional.of(createObjectBuilder().add("id", "id1").build()));
360+
when(referenceDataService.isHearingLanguageWelsh(any(JsonEnvelope.class), any(String.class))).thenReturn(Optional.empty());
361+
362+
final JsonEnvelope returnedEnvelope = hearingQueryApi.searchHearingsForCourtListPayload(query);
363+
364+
assertThat(returnedEnvelope.payloadAsJsonObject().getString("id"), is("id1"));
365+
assertThat(returnedEnvelope.payloadAsJsonObject().getString("templateName"), is("CourtList"));
366+
verify(alphabeticalCourtListService).buildAlphabeticalCourtListData(any(JsonEnvelope.class), any(String.class));
367+
verify(standardPublicCourtListAssembler, never()).assemble(any(), any(), any(), any(), anyBoolean(), anyBoolean());
368+
}
369+
370+
@Test
371+
public void shouldRouteJudgeToJudgeAssemblerUsingJudgeRangeSearchAndReturnJudgeListTemplate() {
372+
final JsonEnvelope query = envelopeFrom(
373+
metadataBuilder()
374+
.withId(fromString("6d4ced64-b058-4bd4-a652-98d8230b92a5"))
375+
.withName("listing.search.court.list.payload"),
376+
createObjectBuilder()
377+
.add(COURT_CENTRE_ID, randomUUID().toString())
378+
.add(COURT_ROOM_ID, randomUUID().toString())
379+
.add("startDate", "2026-06-03")
380+
.add(LIST_ID, JUDGE.toString())
381+
.build());
382+
383+
final JsonEnvelope judgeContent = mock(JsonEnvelope.class);
384+
when(hearingQueryView.rangeSearchHearingsForJudge(query)).thenReturn(judgeContent);
385+
when(judgeListTemplateAssembler.assemble(any(JsonEnvelope.class), any(String.class), any(String.class), any(CourtListType.class), any(String.class)))
386+
.thenReturn(Optional.of(createObjectBuilder().add("id", "id1").build()));
387+
when(referenceDataService.isHearingLanguageWelsh(any(JsonEnvelope.class), any(String.class))).thenReturn(Optional.empty());
388+
389+
final JsonEnvelope returnedEnvelope = hearingQueryApi.searchHearingsForCourtListPayload(query);
390+
391+
assertThat(returnedEnvelope.payloadAsJsonObject().getString("id"), is("id1"));
392+
assertThat(returnedEnvelope.payloadAsJsonObject().getString("templateName"), is("JudgeList"));
393+
verify(hearingQueryView).rangeSearchHearingsForJudge(query);
394+
verify(hearingQueryView, never()).getCourtListContent(query);
395+
verify(judgeListTemplateAssembler).assemble(any(JsonEnvelope.class), any(String.class), any(String.class), any(CourtListType.class), any(String.class));
396+
}
397+
332398
@Test
333399
public void shouldReturnPayloadWithTemplateNameWhenOnlinePublicCourtList() {
334400
final JsonEnvelope query = envelopeFrom(

0 commit comments

Comments
 (0)