diff --git a/src/main/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionController.java b/src/main/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionController.java index d1559b72..de91b78b 100644 --- a/src/main/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionController.java +++ b/src/main/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionController.java @@ -3,6 +3,7 @@ import gov.cabinetoffice.gap.adminbackend.annotations.SpotlightPublisherHeaderValidator; import gov.cabinetoffice.gap.adminbackend.dtos.spotlightSubmissions.SpotlightSubmissionDto; import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission; +import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus; import gov.cabinetoffice.gap.adminbackend.mappers.SpotlightSubmissionMapper; import gov.cabinetoffice.gap.adminbackend.services.SpotlightSubmissionService; import io.swagger.v3.oas.annotations.Operation; @@ -56,4 +57,17 @@ public ResponseEntity getSpotlightSubmissionById( .body(spotlightSubmissionMapper.spotlightSubmissionToSpotlightSubmissionDto(spotlightSubmission)); } + @GetMapping(value = "/count/{schemeId}") + public ResponseEntity getSpotlightSubmissionCount(@PathVariable Integer schemeId) { + final Long count = spotlightSubmissionService.getCountBySchemeIdAndStatus(schemeId, + SpotlightSubmissionStatus.SENT); + return ResponseEntity.ok(count); + } + + @GetMapping(value = "/last-updated/{schemeId}") + public ResponseEntity getLastUpdatedDate(@PathVariable Integer schemeId) { + final String date = spotlightSubmissionService.getLastSubmissionDate(schemeId, SpotlightSubmissionStatus.SENT); + return ResponseEntity.ok(date); + } + } diff --git a/src/main/java/gov/cabinetoffice/gap/adminbackend/entities/SpotlightSubmission.java b/src/main/java/gov/cabinetoffice/gap/adminbackend/entities/SpotlightSubmission.java index 44b1ac55..953c2e50 100644 --- a/src/main/java/gov/cabinetoffice/gap/adminbackend/entities/SpotlightSubmission.java +++ b/src/main/java/gov/cabinetoffice/gap/adminbackend/entities/SpotlightSubmission.java @@ -8,15 +8,7 @@ import lombok.Setter; import lombok.ToString; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import javax.persistence.Table; +import javax.persistence.*; import java.time.Instant; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/gov/cabinetoffice/gap/adminbackend/repositories/SpotlightSubmissionRepository.java b/src/main/java/gov/cabinetoffice/gap/adminbackend/repositories/SpotlightSubmissionRepository.java index d991f141..dedbd79f 100644 --- a/src/main/java/gov/cabinetoffice/gap/adminbackend/repositories/SpotlightSubmissionRepository.java +++ b/src/main/java/gov/cabinetoffice/gap/adminbackend/repositories/SpotlightSubmissionRepository.java @@ -4,9 +4,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.UUID; @Repository public interface SpotlightSubmissionRepository extends JpaRepository { + List findByGrantSchemeIdAndStatus(Integer id, String status); + + long countByGrantSchemeIdAndStatus(Integer id, String status); + } diff --git a/src/main/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionService.java b/src/main/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionService.java index c98bbdf6..6666e1a2 100644 --- a/src/main/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionService.java +++ b/src/main/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionService.java @@ -2,11 +2,16 @@ import gov.cabinetoffice.gap.adminbackend.entities.SpotlightBatch; import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission; +import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus; import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException; import gov.cabinetoffice.gap.adminbackend.repositories.SpotlightSubmissionRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.UUID; @Service @@ -20,4 +25,30 @@ public SpotlightSubmission getSpotlightSubmission(UUID spotlightSubmissionId) { "A spotlight submission with id " + spotlightSubmissionId + " could not be found")); } + public void addSpotlightBatchToSpotlightSubmission(UUID spotlightSubmissionId, SpotlightBatch spotlightBatch) { + final SpotlightSubmission spotlightSubmission = getSpotlightSubmission(spotlightSubmissionId); + + final List existingBatch = spotlightSubmission.getBatches(); + existingBatch.add(spotlightBatch); + spotlightSubmission.setBatches(existingBatch); + + spotlightSubmissionRepository.save(spotlightSubmission); + } + + public List getSubmissionsByBySchemeIdAndStatus(Integer schemeId, + SpotlightSubmissionStatus status) { + return spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(schemeId, status.toString()); + } + + public long getCountBySchemeIdAndStatus(Integer schemeId, SpotlightSubmissionStatus status) { + return spotlightSubmissionRepository.countByGrantSchemeIdAndStatus(schemeId, status.toString()); + } + + public String getLastSubmissionDate(Integer schemeId, SpotlightSubmissionStatus status) { + final List spotlightSubmissions = getSubmissionsByBySchemeIdAndStatus(schemeId, status); + return spotlightSubmissions.stream().map(SpotlightSubmission::getLastSendAttempt).max(Instant::compareTo) + .map(date -> date.atZone(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("dd MMMM yyyy"))) + .orElse(""); + } + } diff --git a/src/test/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionControllerTest.java b/src/test/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionControllerTest.java index 9764bef6..b7f97ec9 100644 --- a/src/test/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionControllerTest.java +++ b/src/test/java/gov/cabinetoffice/gap/adminbackend/controllers/SpotlightSubmissionControllerTest.java @@ -3,6 +3,7 @@ import gov.cabinetoffice.gap.adminbackend.config.SpotlightPublisherInterceptor; import gov.cabinetoffice.gap.adminbackend.dtos.spotlightSubmissions.SpotlightSubmissionDto; import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission; +import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus; import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException; import gov.cabinetoffice.gap.adminbackend.mappers.SpotlightSubmissionMapper; import gov.cabinetoffice.gap.adminbackend.mappers.ValidationErrorMapper; @@ -23,8 +24,7 @@ import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(SchemeController.class) @AutoConfigureMockMvc(addFilters = false) @@ -52,6 +52,26 @@ class SpotlightSubmissionControllerTest { @MockBean private SpotlightSubmissionMapper spotlightSubmissionMapper; + private final Integer SCHEME_ID = 1; + + private final String DATE = "25 September 2023"; + + @Test + void getSpotlightSubmissionCount() throws Exception { + when(mockSpotlightSubmissionService.getCountBySchemeIdAndStatus(SCHEME_ID, SpotlightSubmissionStatus.SENT)) + .thenReturn(Long.valueOf(2)); + mockMvc.perform(get("/spotlight-submissions/count/{schemeId}", SCHEME_ID)).andExpect(status().isOk()) + .andExpect(content().string("2")); + } + + @Test + void getLastUpdatedDate() throws Exception { + when(mockSpotlightSubmissionService.getLastSubmissionDate(SCHEME_ID, SpotlightSubmissionStatus.SENT)) + .thenReturn(DATE); + mockMvc.perform(get("/spotlight-submissions/last-updated/{schemeId}", SCHEME_ID)).andExpect(status().isOk()) + .andExpect(content().string(DATE)); + } + @Nested class getSpotlightSubmissionById { diff --git a/src/test/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionServiceTest.java b/src/test/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionServiceTest.java index a171fe33..7572fd2b 100644 --- a/src/test/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionServiceTest.java +++ b/src/test/java/gov/cabinetoffice/gap/adminbackend/services/SpotlightSubmissionServiceTest.java @@ -2,6 +2,7 @@ import gov.cabinetoffice.gap.adminbackend.annotations.WithAdminSession; import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission; +import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus; import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException; import gov.cabinetoffice.gap.adminbackend.repositories.SpotlightSubmissionRepository; import org.junit.jupiter.api.Nested; @@ -10,11 +11,15 @@ import org.mockito.Mock; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import java.time.*; +import java.util.List; import java.util.Optional; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @SpringJUnitConfig @@ -29,6 +34,69 @@ class SpotlightSubmissionServiceTest { @InjectMocks private SpotlightSubmissionService spotlightSubmissionService; + private final Integer SCHEME_ID = 1; + + private final LocalDate date = LocalDate.of(2023, 9, 25); + + private final LocalTime time = LocalTime.of(0, 0, 0); + + private final LocalDateTime dateTime = LocalDateTime.of(date, time); + + private final Instant DATE = dateTime.toInstant(ZoneOffset.UTC); + + private final SpotlightSubmission spotlightSubmission = SpotlightSubmission.builder().id(UUID.randomUUID()) + .lastSendAttempt(DATE).build(); + + @Test + void getSubmissionsByBySchemeIdAndStatus_ReturnsList() { + when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of(spotlightSubmission)); + + final List result = spotlightSubmissionService + .getSubmissionsByBySchemeIdAndStatus(SCHEME_ID, SpotlightSubmissionStatus.SENT); + + verify(spotlightSubmissionRepository).findByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString()); + assertThat(result).isEqualTo(List.of(spotlightSubmission)); + } + + @Test + void getCountBySchemeIdAndStatus_ReturnsCount() { + when(spotlightSubmissionRepository.countByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString())).thenReturn(Long.valueOf(2)); + + final long result = spotlightSubmissionService.getCountBySchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT); + + verify(spotlightSubmissionRepository).countByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString()); + assertThat(result).isEqualTo(2); + + } + + @Nested + class getLastSubmissionDate { + + @Test + void getLastSubmissionDate_NoSubmissions() { + when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of()); + final String result = spotlightSubmissionService.getLastSubmissionDate(SCHEME_ID, + SpotlightSubmissionStatus.SENT); + assertThat(result).isEmpty(); + } + + @Test + void getLastSubmissionDate_HasSubmissions() { + when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID, + SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of(spotlightSubmission)); + final String result = spotlightSubmissionService.getLastSubmissionDate(SCHEME_ID, + SpotlightSubmissionStatus.SENT); + assertThat(result).isEqualTo("25 September 2023"); + } + + } + @Nested class getSpotlightSubmission {