Skip to content

Commit

Permalink
Add Offense Reference Data Endpoint & infrastructure code
Browse files Browse the repository at this point in the history
  • Loading branch information
RustyHMCTS committed May 1, 2024
1 parent e8c22f9 commit fcca14e
Show file tree
Hide file tree
Showing 24 changed files with 702 additions and 510 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import uk.gov.hmcts.opal.dto.search.OffenseSearchDto;
import uk.gov.hmcts.opal.controllers.OffenceController;
import uk.gov.hmcts.opal.dto.search.OffenceSearchDto;
import uk.gov.hmcts.opal.entity.BusinessUnitEntity;
import uk.gov.hmcts.opal.entity.OffenseEntity;
import uk.gov.hmcts.opal.service.opal.OffenseService;
import uk.gov.hmcts.opal.entity.OffenceEntity;
import uk.gov.hmcts.opal.service.opal.OffenceService;

import static java.util.Collections.singletonList;
import static org.mockito.ArgumentMatchers.any;
Expand All @@ -24,75 +25,73 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest
@ContextConfiguration(classes = OffenseController.class)
@ContextConfiguration(classes = OffenceController.class)
@ActiveProfiles({"integration"})
class OffenseControllerIntegrationTest {
class OffenceControllerIntegrationTest {

@Autowired
MockMvc mockMvc;

@MockBean
@Qualifier("offenseService")
OffenseService offenseService;
@Qualifier("offenceService")
OffenceService offenceService;

@Test
void testGetOffenseById() throws Exception {
OffenseEntity offenseEntity = createOffenseEntity();
void testGetOffenceById() throws Exception {
OffenceEntity offenceEntity = createOffenceEntity();

when(offenseService.getOffense((short)1)).thenReturn(offenseEntity);
when(offenceService.getOffence((short)1)).thenReturn(offenceEntity);

mockMvc.perform(get("/api/offense/1"))
mockMvc.perform(get("/api/offence/1"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.offenseId").value(1))
.andExpect(jsonPath("$.offenceId").value(1))
.andExpect(jsonPath("$.cjsCode").value("cjs-code"))
.andExpect(jsonPath("$.offenseTitle").value("Title of Offense"))
.andExpect(jsonPath("$.offenseTitleCy").value("Title of Offense CY"));
.andExpect(jsonPath("$.offenceTitle").value("Title of Offence"))
.andExpect(jsonPath("$.offenceTitleCy").value("Title of Offence CY"));
}


@Test
void testGetOffenseById_WhenOffenseDoesNotExist() throws Exception {
when(offenseService.getOffense((short)2)).thenReturn(null);
void testGetOffenceById_WhenOffenceDoesNotExist() throws Exception {
when(offenceService.getOffence((short)2)).thenReturn(null);

mockMvc.perform(get("/api/offense/2"))
mockMvc.perform(get("/api/offence/2"))
.andExpect(status().isNoContent());
}

@Test
void testPostOffensesSearch() throws Exception {
OffenseEntity offenseEntity = createOffenseEntity();
void testPostOffencesSearch() throws Exception {
OffenceEntity offenceEntity = createOffenceEntity();

when(offenseService.searchOffenses(any(OffenseSearchDto.class))).thenReturn(singletonList(offenseEntity));
when(offenceService.searchOffences(any(OffenceSearchDto.class))).thenReturn(singletonList(offenceEntity));

mockMvc.perform(post("/api/offense/search")
mockMvc.perform(post("/api/offence/search")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"criteria\":\"value\"}"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$[0].offenseId").value(1))
.andExpect(jsonPath("$[0].offenceId").value(1))
.andExpect(jsonPath("$[0].cjsCode").value("cjs-code"))
.andExpect(jsonPath("$[0].offenseTitle").value("Title of Offense"))
.andExpect(jsonPath("$[0].offenseTitleCy").value("Title of Offense CY"));
.andExpect(jsonPath("$[0].offenceTitle").value("Title of Offence"))
.andExpect(jsonPath("$[0].offenceTitleCy").value("Title of Offence CY"));
}

@Test
void testPostOffensesSearch_WhenOffenseDoesNotExist() throws Exception {
// when(offenseService.getOffense(2L)).thenReturn(null);

mockMvc.perform(post("/api/offense/search")
void testPostOffencesSearch_WhenOffenceDoesNotExist() throws Exception {
mockMvc.perform(post("/api/offence/search")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"criteria\":\"2\"}"))
.andExpect(status().isNoContent());
}

private OffenseEntity createOffenseEntity() {
return OffenseEntity.builder()
.offenseId((short)1)
private OffenceEntity createOffenceEntity() {
return OffenceEntity.builder()
.offenceId(1L)
.cjsCode("cjs-code")
.businessUnit(BusinessUnitEntity.builder().build())
.offenseTitle("Title of Offense")
.offenseTitleCy("Title of Offense CY")
.offenceTitle("Title of Offence")
.offenceTitleCy("Title of Offence CY")
.build();
}
}
74 changes: 74 additions & 0 deletions src/main/java/uk/gov/hmcts/opal/controllers/OffenceController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package uk.gov.hmcts.opal.controllers;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import uk.gov.hmcts.opal.dto.reference.OffenceReferenceDataResults;
import uk.gov.hmcts.opal.dto.search.OffenceSearchDto;
import uk.gov.hmcts.opal.entity.OffenceEntity;
import uk.gov.hmcts.opal.entity.projection.OffenceReferenceData;
import uk.gov.hmcts.opal.service.OffenceServiceInterface;
import uk.gov.hmcts.opal.service.opal.OffenceService;

import java.util.List;
import java.util.Optional;

import static uk.gov.hmcts.opal.util.HttpUtil.buildResponse;


@RestController
@RequestMapping("/api/offence")
@Slf4j(topic = "OffenceController")
@Tag(name = "Offence Controller")
public class OffenceController {

private final OffenceServiceInterface offenceService;
private final OffenceService opalOffenceService;

public OffenceController(@Qualifier("offenceService") OffenceServiceInterface offenceService,
OffenceService opalOffenceService) {
this.offenceService = offenceService;
this.opalOffenceService = opalOffenceService;
}

@GetMapping(value = "/{offenceId}")
@Operation(summary = "Returns the Offence for the given offenceId.")
public ResponseEntity<OffenceEntity> getOffenceById(@PathVariable Long offenceId) {

log.info(":GET:getOffenceById: offenceId: {}", offenceId);

OffenceEntity response = offenceService.getOffence(offenceId);

return buildResponse(response);
}

@PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Searches Offences based upon criteria in request body")
public ResponseEntity<List<OffenceEntity>> postOffencesSearch(@RequestBody OffenceSearchDto criteria) {
log.info(":POST:postOffencesSearch: query: \n{}", criteria);

List<OffenceEntity> response = offenceService.searchOffences(criteria);

return buildResponse(response);
}

@GetMapping(value = {"/ref-data", "/ref-data/", "/ref-data/{filter}"})
@Operation(summary = "Returns Offences as reference data with an option filter applied")
public ResponseEntity<OffenceReferenceDataResults> getOffenceRefData(@PathVariable Optional<String> filter) {
log.info(":GET:getOffenceRefData: query: \n{}", filter);

List<OffenceReferenceData> refData = opalOffenceService.getReferenceData(filter);

log.info(":GET:getOffenceRefData: offences reference data count: {}", refData.size());
return ResponseEntity.ok(OffenceReferenceDataResults.builder().refData(refData).build());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package uk.gov.hmcts.opal.dto.reference;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.opal.entity.projection.OffenceReferenceData;

import java.util.List;
import java.util.Optional;

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class OffenceReferenceDataResults {
private Integer count;
private List<OffenceReferenceData> refData;

public static class OffenceReferenceDataResultsBuilder {
public OffenceReferenceDataResults.OffenceReferenceDataResultsBuilder refData(
List<OffenceReferenceData> refData) {
this.refData = refData;
this.count(Optional.ofNullable(refData).map(List::size).orElse(0));
return this;
}

private OffenceReferenceDataResults.OffenceReferenceDataResultsBuilder count(Integer count) {
this.count = count;
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

@Data
@Builder
public class OffenseSearchDto implements ToJsonString {
public class OffenceSearchDto implements ToJsonString {

private String offenseId;
private String offenceId;
private String cjsCode;
private String businessUnitId;
private String businessUnitName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,51 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Table(name = "offenses")
@Table(name = "offences")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "offenseId")
public class OffenseEntity {
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "offenceId")
public class OffenceEntity {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "offense_id_seq_generator")
@SequenceGenerator(name = "offense_id_seq_generator", sequenceName = "offense_id_seq", allocationSize = 1)
@Column(name = "offense_id", nullable = false)
private Short offenseId;
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "offence_id_seq_generator")
@SequenceGenerator(name = "offence_id_seq_generator", sequenceName = "offence_id_seq", allocationSize = 1)
@Column(name = "offence_id", nullable = false)
private Long offenceId;

@Column(name = "cjs_code", length = 10, nullable = false)
private String cjsCode;

@ManyToOne
@JoinColumn(name = "business_unit_id", updatable = false)
@JoinColumn(name = "business_unit_id")
private BusinessUnitEntity businessUnit;

@Column(name = "offense_title", length = 120, nullable = false)
private String offenseTitle;
@Column(name = "offence_title", length = 120)
private String offenceTitle;

@Column(name = "offence_title_cy", length = 120)
private String offenceTitleCy;

@Column(name = "date_used_to")
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime dateUsedTo;

@Column(name = "offence_oas")
private String offenceOas;

@Column(name = "offense_title_cy", length = 120, nullable = false)
private String offenseTitleCy;
@Column(name = "offence_oas_cy")
private String offenceOasCy;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package uk.gov.hmcts.opal.entity.projection;

public interface OffenceReferenceData {

Long getOffenceId();

String getCjsCode();

String getOffenceTitle();

String getOffenceTitleCy();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import uk.gov.hmcts.opal.entity.OffenseEntity;
import uk.gov.hmcts.opal.entity.OffenceEntity;

@Repository
public interface OffenseRepository extends JpaRepository<OffenseEntity, Short>,
JpaSpecificationExecutor<OffenseEntity> {
public interface OffenceRepository extends JpaRepository<OffenceEntity, Long>,
JpaSpecificationExecutor<OffenceEntity> {
}
Loading

0 comments on commit fcca14e

Please sign in to comment.