diff --git a/infrastructure/main.tf b/infrastructure/main.tf index b3f5695fd4..97c1ffa78c 100644 --- a/infrastructure/main.tf +++ b/infrastructure/main.tf @@ -10,7 +10,7 @@ locals { env_to_deploy = 1 env_long_name = var.env == "sbox" ? "sandbox" : var.env == "stg" ? "staging" : var.env apim_service_url = var.env == "prod" ? "https://pre-api.platform.hmcts.net" : "https://pre-api.${local.env_long_name}.platform.hmcts.net" - api_revision = "128" + api_revision = "129" } data "azurerm_client_config" "current" {} diff --git a/pre-api-stg.yaml b/pre-api-stg.yaml index a60957b648..4e3d06ed76 100644 --- a/pre-api-stg.yaml +++ b/pre-api-stg.yaml @@ -2656,6 +2656,10 @@ paths: in: query name: hasRecordings type: boolean + - description: Include bookings marked as deleted + in: query + name: includeDeleted + type: boolean - description: >- Search bookings with at least one associated capture session with one of the statuses listed diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java index 6326f7e740..672cf47fcd 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java @@ -98,6 +98,7 @@ public void testSearchBookingsNotSuperUser() { null, null, null, + null, Pageable.unpaged(Sort.by(Sort.Order.asc("scheduledFor"))) ); assertEquals(1, findAllSharedWithUser.toList().size(), "Should find 1 booking"); @@ -197,6 +198,7 @@ public void testSearchBookings() { null, null, null, + null, Pageable.unpaged(Sort.by(Sort.Order.asc("scheduledFor"))) ); assertEquals(2, findByCaseReferenceResult.getContent().size(), "Should find 2 bookings"); @@ -212,6 +214,7 @@ public void testSearchBookings() { null, null, null, + null, Pageable.unpaged(Sort.by(Sort.Order.asc("scheduledFor"))) ); assertEquals(1, findByScheduledForResult.getContent().size(), "Should find 1 bookings"); @@ -229,6 +232,7 @@ public void testSearchBookings() { null, null, null, + null, null); assertEquals(1, findByParticipantResult.getContent().size()); assertEquals( @@ -245,6 +249,7 @@ public void testSearchBookings() { null, null, null, + null, null).toList(); assertEquals(1, findByCourtIdResult.size()); assertEquals( @@ -262,6 +267,7 @@ public void testSearchBookings() { false, null, null, + null, Pageable.unpaged(Sort.by(Sort.Order.asc("scheduledFor"))) ).toList(); assertEquals(findByHasRecordingsFalse.size(), 1); @@ -279,6 +285,7 @@ public void testSearchBookings() { true, null, null, + null, Pageable.unpaged(Sort.by(Sort.Order.asc("scheduledFor"))) ).toList(); assertEquals(findByHasRecordingsTrue.size(), 1); @@ -366,6 +373,7 @@ void testSearchByCaptureSessionStatus() { Optional.empty(), null, null, + null, List.of(RecordingStatus.STANDBY), null, null).getContent(); @@ -378,6 +386,7 @@ void testSearchByCaptureSessionStatus() { Optional.empty(), null, null, + null, List.of(RecordingStatus.PROCESSING), null, null).getContent(); @@ -390,6 +399,7 @@ void testSearchByCaptureSessionStatus() { Optional.empty(), null, null, + null, List.of( RecordingStatus.STANDBY, RecordingStatus.PROCESSING @@ -408,6 +418,7 @@ void testSearchByCaptureSessionStatus() { Optional.empty(), null, null, + null, List.of(RecordingStatus.NO_RECORDING), null, null).getContent(); @@ -420,6 +431,7 @@ void testSearchByCaptureSessionStatus() { null, null, null, + null, List.of(RecordingStatus.STANDBY), null).getContent(); assertThat(findOnlyWithProcessing).hasSize(1); @@ -432,6 +444,7 @@ void testSearchByCaptureSessionStatus() { null, null, null, + null, List.of( RecordingStatus.STANDBY, RecordingStatus.PROCESSING @@ -661,6 +674,7 @@ void searchBookingsEnableMigratedDataToggleNonSuperUser() { null, null, null, + null, null ); @@ -698,6 +712,7 @@ void searchBookingsEnableMigratedDataToggleSuperUser() { null, null, null, + null, null ); @@ -759,6 +774,7 @@ void searchBookingsEnableMigratedDataToggleNonSuperUser() { null, null, null, + null, null ); @@ -799,6 +815,7 @@ void searchBookingsEnableMigratedDataToggleSuperUser() { null, null, null, + null, null ); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java index d5176791f9..ac76537011 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java @@ -99,6 +99,12 @@ public BookingController(final BookingService bookingService, final ShareBooking description = "If the booking has any recordings", schema = @Schema(implementation = Boolean.class) ) + + @Parameter( + name = "includeDeleted", + description = "Include bookings marked as deleted", + schema = @Schema(implementation = Boolean.class) + ) @Parameter( name = "captureSessionStatusIn", description = "Search bookings with at least one associated capture session with one of the statuses listed", @@ -144,12 +150,14 @@ public HttpEntity>> searchByCaseId( : Optional.empty(), params.getParticipantId(), params.getHasRecordings(), + params.getIncludeDeleted() != null && params.getIncludeDeleted(), params.getCaptureSessionStatusIn() == null || params.getCaptureSessionStatusIn().isEmpty() ? null : params.getCaptureSessionStatusIn(), params.getCaptureSessionStatusNotIn() == null || params.getCaptureSessionStatusNotIn().isEmpty() ? null : params.getCaptureSessionStatusNotIn(), + pageable ); if (pageable.getPageNumber() > resultPage.getTotalPages()) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/params/SearchBookings.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/params/SearchBookings.java index 5d7661da33..d4bfb0000b 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/params/SearchBookings.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/params/SearchBookings.java @@ -17,6 +17,7 @@ public class SearchBookings { private LocalDate scheduledFor; private UUID participantId; private Boolean hasRecordings; + private Boolean includeDeleted; private List captureSessionStatusIn; private List captureSessionStatusNotIn; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java index 8e1222c492..ad24aecc9c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java @@ -35,6 +35,7 @@ public interface BookingRepository extends JpaRepository { (:reference IS NULL OR b.caseId.reference ILIKE %:reference%) AND (CAST(:caseId as uuid) IS NULL OR b.caseId.id = :caseId) AND (CAST(:courtId as uuid) IS NULL OR b.caseId.court.id = :courtId) + AND (:includeDeleted = TRUE OR b.deletedAt IS NULL) AND (CAST(:scheduledForFrom as Timestamp) IS NULL OR CAST(:scheduledForUntil as Timestamp) IS NULL OR CAST(FUNCTION('TIMEZONE', 'Europe/London', b.scheduledFor) as Timestamp) @@ -79,6 +80,7 @@ Page searchBookingsBy( @Param("authorisedBookings") List authorisedBookings, @Param("authCourtId") UUID authCourtId, @Param("hasRecordings") Boolean hasRecordings, + @Param("includeDeleted") Boolean includeDeleted, @Param("statuses") List statuses, @Param("notStatuses") List notStatuses, @Param("includeVodafone") boolean includeVodafone, diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java index 372242b089..c4550f37a3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java @@ -89,6 +89,7 @@ public Page searchBy( Optional scheduledFor, UUID participantId, Boolean hasRecordings, + Boolean includeDeleted, List statuses, List notStatuses, Pageable pageable @@ -114,6 +115,7 @@ public Page searchBy( authorisedBookings, authorisedCourt, hasRecordings, + includeDeleted, statuses, notStatuses, enableMigratedData || auth.hasRole("ROLE_SUPER_USER"), @@ -252,6 +254,7 @@ public List findAllBookingsForToday() { null, null, null, + null, Pageable.unpaged() ) .toList(); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/controller/BookingControllerTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/controller/BookingControllerTest.java index 260adef307..d09b61e184 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/controller/BookingControllerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/controller/BookingControllerTest.java @@ -115,7 +115,7 @@ void searchBookingsOk() throws Exception { booking2.setId(UUID.randomUUID()); booking2.setCaseDTO(caseDTO2); - when(bookingService.searchBy(any(), eq("MyRef"), any(), any(), any(), any(), any(), any(), any())) + when(bookingService.searchBy(any(), eq("MyRef"), any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(new PageImpl<>(List.of(booking1, booking2))); MvcResult response = mockMvc.perform(get("/bookings?caseReference=MyRef") @@ -144,8 +144,19 @@ void getAllBookingsForCaseIDEndpointOk() throws Exception { booking2.setId(UUID.randomUUID()); booking2.setCaseDTO(caseDTO); - when(bookingService.searchBy(eq(caseDTO.getId()), any(), any(), any(), any(), any(), any(), any(), any())) - .thenReturn(new PageImpl<>(List.of(booking1, booking2))); + when(bookingService + .searchBy( + eq(caseDTO.getId()), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(new PageImpl<>(List.of(booking1, booking2))); MvcResult response = mockMvc.perform(get("/bookings?caseId=" + caseDTO.getId()) @@ -174,7 +185,7 @@ void getOutOfBoundsPageError() throws Exception { var booking2 = new BookingDTO(); booking2.setId(UUID.randomUUID()); booking2.setCaseDTO(caseDTO); - when(bookingService.searchBy(any(), any(), any(), any(), any(), any(), any(), any(), any())) + when(bookingService.searchBy(any(), any(), any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(new PageImpl<>(List.of(booking1, booking2))); @@ -196,8 +207,19 @@ void getAllBookingsForCaseIdEndpointEmptyOk() throws Exception { var caseDTO = new CaseDTO(); caseDTO.setId(UUID.randomUUID()); - when(bookingService.searchBy(eq(caseDTO.getId()), any(), any(), any(), any(), any(), any(), any(), any())) - .thenReturn(Page.empty()); + when(bookingService + .searchBy( + eq(caseDTO.getId()), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(Page.empty()); MvcResult response = mockMvc.perform(get("/bookings?caseId=" + caseDTO.getId()) .with(csrf()) @@ -214,8 +236,19 @@ void getAllBookingsForCaseIdEndpointEmptyOk() throws Exception { @DisplayName("Should get all bookings with a capture session one of the listed statuses") @Test void searchBookingsByStatusOk() throws Exception { - when(bookingService.searchBy(any(), any(), any(), any(), any(), any(), any(), any(), any())) - .thenReturn(Page.empty()); + when(bookingService + .searchBy( + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(Page.empty()); mockMvc.perform(get("/bookings?captureSessionStatusIn=RECORDING,NO_RECORDING")) .andExpect(status().isOk()); @@ -228,6 +261,7 @@ void searchBookingsByStatusOk() throws Exception { any(), any(), any(), + any(), eq(List.of(RecordingStatus.RECORDING, RecordingStatus.NO_RECORDING)), any(), any() @@ -237,7 +271,7 @@ void searchBookingsByStatusOk() throws Exception { @DisplayName("Should get all bookings with a capture session one of the listed statuses") @Test void searchBookingsByNotStatusOk() throws Exception { - when(bookingService.searchBy(any(), any(), any(), any(), any(), any(), any(), any(), any())) + when(bookingService.searchBy(any(), any(), any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(Page.empty()); mockMvc.perform(get("/bookings?captureSessionStatusNotIn=RECORDING,NO_RECORDING")) @@ -252,6 +286,7 @@ void searchBookingsByNotStatusOk() throws Exception { any(), any(), any(), + any(), eq(List.of(RecordingStatus.RECORDING, RecordingStatus.NO_RECORDING)), any() ); @@ -845,6 +880,100 @@ void undeleteBookingNotFound() throws Exception { .value("Not found: Booking: " + bookingId)); } + @DisplayName("Should set include deleted param to false if not set") + @Test + public void testGetCasesIncludeDeletedNotSet() throws Exception { + when(bookingService.searchBy(any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(new PageImpl<>(List.of())); + + mockMvc.perform(get("/bookings") + .with(csrf()) + .accept(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andReturn(); + + verify(bookingService, times(1)).searchBy(any(), + any(), + any(), + any(), + any(), + any(), + eq(false), + any(), + any(), + any()); + } + + @DisplayName("Should set include deleted param to false when set to false") + @Test + public void testGetCasesIncludeDeletedFalse() throws Exception { + when(bookingService.searchBy(any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(new PageImpl<>(List.of())); + + mockMvc.perform(get("/bookings") + .with(csrf()) + .param("includeDeleted", "false") + .accept(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andReturn(); + + + verify(bookingService, times(1)).searchBy(any(), any(), any(), any(), any(), any(), + eq(false), any(), any(),any()); + } + + @DisplayName("Should set include deleted param to true when set to true") + @Test + public void testGetCasesIncludeDeletedTrue() throws Exception { + when(bookingService.searchBy(any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any(), + any())) + .thenReturn(new PageImpl<>(List.of())); + + mockMvc.perform(get("/bookings") + .with(csrf()) + .param("includeDeleted", "true") + .accept(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()) + .andReturn(); + + verify(bookingService, times(1)).searchBy(any(), + any(), + any(), + any(), + any(), + any(), + eq(true), + any(), + any(), + any()); + } + private String getPath(UUID bookingId) { return "/bookings/" + bookingId; } diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java index 2d0dca865d..117ed292d6 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java @@ -153,6 +153,7 @@ void searchByCaseRefSuccess() { null, null, null, + null, false, null )) @@ -164,7 +165,7 @@ void searchByCaseRefSuccess() { })); assertThat( bookingService - .searchBy(null, "MyRef", null, Optional.empty(), null, null, null, null, null) + .searchBy(null, "MyRef", null, Optional.empty(), null, null, null, null, null, null) .getContent()).isEqualTo(List.of(bookingModel1, bookingModel2)); } @@ -636,6 +637,7 @@ void findAllBookingsForToday() { any(), any(), any(), + any(), anyBoolean(), any())).thenReturn(new PageImpl<>(List.of(booking1, booking2))); @@ -655,6 +657,7 @@ void findAllBookingsForToday() { any(), any(), any(), + any(), anyBoolean(), any()); } diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookingsTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookingsTest.java index ba10a7cda1..62ac0464bf 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookingsTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookingsTest.java @@ -143,6 +143,7 @@ public void testScheduledBookingsAreNotFound() { any(), any(), any(), + any(), any())) .thenReturn(new PageImpl<>(List.of()));