Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class SurveyCasesEndpoint {
private final AuthUser authUser;

private static final String searchCasesPartialQuery =
"SELECT c.id, c.case_ref, e.name collex_name";
"SELECT c.id, c.case_ref, e.name collex_name, c.address_line1, c.case_type, c.postcode, c.uprn, c.address_type";
private static final String searchCasesInSurveyPartialQuery =
searchCasesPartialQuery
+ " FROM cases.cases c, cases.collection_exercise e WHERE c.collection_exercise_id = e.id"
Expand All @@ -55,28 +55,31 @@ public SurveyCasesEndpoint(

@GetMapping(value = "/{surveyId}")
@ResponseBody
public List<CaseSearchResult> searchCasesBySampleData(
public List<CaseSearchResult> searchCasesByColumnNameTerm(
@Value("#{request.getAttribute('userEmail')}") String userEmail,
@PathVariable(value = "surveyId") UUID surveyId,
@RequestParam(value = "searchTerm") String searchTerm,
@RequestParam(value = "collexId", required = false) Optional<UUID> collexId,
@RequestParam(value = "invalid", required = false) Optional<Boolean> caseInvalid,
@RequestParam(value = "refusal", required = false)
Optional<UIRefusalTypeDTO> refusalReceived) {
@RequestParam(value = "refusal", required = false) Optional<UIRefusalTypeDTO> refusalReceived,
@RequestParam(value = "nameTerm", required = false, defaultValue = "postcode")
String nameTerm) {

checkSurveySearchCasesPermission(userEmail, surveyId);
checkCaseSearchNameTerm(nameTerm);

String escapedSearchTerm = escapeSqlLikeSpecialCharacters(searchTerm);
String likeSearchTerm = String.format("%%%s%%", escapedSearchTerm);
StringBuilder queryStringBuilder = new StringBuilder(searchCasesInSurveyPartialQuery);
queryStringBuilder
.append(" AND EXISTS (SELECT * FROM jsonb_each_text(c.sample) AS x(ky, val)")
.append(
" WHERE LOWER(REPLACE(x.val, ' ', '')) LIKE LOWER(REPLACE(:likeSearchTerm, ' ', '')) ESCAPE '\\')");
.append(" AND LOWER(REPLACE(c.")
.append(nameTerm)
Comment thread
ryangrundy7 marked this conversation as resolved.
.append(", ' ', '')) ")
.append(" LIKE LOWER(REPLACE(:likeSearchTerm, ' ', '')) ESCAPE '\\' ");

Map<String, Object> namedParameters = new HashMap();
namedParameters.put("surveyId", surveyId);
namedParameters.put("likeSearchTerm", likeSearchTerm);
namedParameters.put("likeSearchTerm", likeSearchTerm.toLowerCase());

if (collexId.isPresent()) {
queryStringBuilder.append(" AND e.id = :collexId");
Expand Down Expand Up @@ -157,4 +160,27 @@ private void checkSurveySearchCasesPermission(String userEmail, UUID surveyId) {
private String escapeSqlLikeSpecialCharacters(String stringToEscape) {
return stringToEscape.replace("%", "\\%").replace("_", "\\_");
}

private void checkCaseSearchNameTerm(String nameTerm) {
// Allowed column names
List<String> allowedNameTerms =
List.of(
"postcode",
"address_line1",
"address_line2",
"address_line3",
"town_name",
"organisation_name",
"case_ref",
"apb_code",
"case_type",
"uprn",
"region");

// Validate
if (!allowedNameTerms.contains(nameTerm)) {
throw new ResponseStatusException(
HttpStatus.BAD_REQUEST, "Invalid nameTerm. Allowed values: " + allowedNameTerms);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import java.util.Map;
import java.util.UUID;
import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
public class EmailFulfilment {
private UUID caseId;
private String email;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package uk.gov.ons.census.supporttool.model.dto.rest;

import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
public class RequestDTO {
private RequestHeaderDTO header;
private RequestPayloadDTO payload;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package uk.gov.ons.census.supporttool.model.dto.rest;

import java.util.UUID;
import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
public class RequestHeaderDTO {
private String source;
private String channel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
@JsonInclude(Include.NON_NULL)
public class RequestPayloadDTO {
private SmsFulfilment smsFulfilment;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package uk.gov.ons.census.supporttool.model.dto.rest;

import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
public class SkipMessageRequest {
private String messageHash;
private String skippingUser;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import java.util.Map;
import java.util.UUID;
import lombok.Data;

@Data
@SuppressWarnings("SameNameButDifferent")
@lombok.Data
public class SmsFulfilment {
private UUID caseId;
private String phoneNumber;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package uk.gov.ons.census.supporttool.model.dto.ui;

import java.util.Map;
import java.util.UUID;
import lombok.Data;

@Data
public class CaseSearchResult {
public UUID id;
public String caseRef;
public Map<String, String> sample;
public String addressLine1;
public String postcode;
public String caseType;
public String uprn;
public String addressType;
public String collectionExerciseName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ public CaseSearchResult mapRow(ResultSet resultSet, int rowNum) {
caseContainerDto.setId(resultSet.getObject("id", UUID.class));
caseContainerDto.setCaseRef(resultSet.getString("case_ref"));
caseContainerDto.setCollectionExerciseName(resultSet.getString("collex_name"));
caseContainerDto.setAddressLine1(resultSet.getString("address_line1"));
caseContainerDto.setAddressType(resultSet.getString("address_type"));
caseContainerDto.setCaseType(resultSet.getString("case_type"));
caseContainerDto.setUprn(resultSet.getString("uprn"));
caseContainerDto.setPostcode(resultSet.getString("postcode"));
} catch (SQLException e) {
log.atError().setMessage("Error mapping case search results").log();
throw new RuntimeException("Error mapping case search results", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,14 @@ void testCaseEndpoints() {
(bundle) -> String.format("cases/%s", bundle.getCaseId()));
}

@Test
void testCaseSearchTermEndpoints() {
integrationTestHelper.testGet(
port,
UserGroupAuthorisedActivityType.SEARCH_CASES,
(bundle) -> String.format("surveyCases/%s?searchTerm=XX0", bundle.getSurveyId()));
}

@Test
void testCollectionExerciseEndpoints() {
integrationTestHelper.testGet(
Expand Down
Loading