Skip to content
Closed
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
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@
<material.version>17.0.75</material.version>
<json-transformer.version>1.0.6</json-transformer.version>
<access.control.version>6.4.1</access.control.version>
<referencedata.version>17.104.136</referencedata.version>
<referencedata.version>17.104.137</referencedata.version>
<listing.version>17.104.3</listing.version>
<hearing.version>17.104.176</hearing.version>
<hearing.version>17.104.180</hearing.version>
<usersgroups.version>17.104.50</usersgroups.version>
<defence.version>17.104.102</defence.version>
<referencedata.offence.version>17.104.48</referencedata.offence.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package uk.gov.moj.cpp.progression.command;

import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.UUID.fromString;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static uk.gov.justice.core.courts.LinkType.STANDALONE;
import static uk.gov.justice.services.core.annotation.Component.COMMAND_API;
import static uk.gov.justice.services.messaging.Envelope.metadataFrom;
import static uk.gov.moj.cpp.progression.command.api.UserDetailsLoader.getAllowedHearingTypes;
import static uk.gov.moj.cpp.progression.command.api.UserDetailsLoader.isUserHasPermissionForApplicationTypeCode;

import uk.gov.justice.services.adapter.rest.exception.BadRequestException;
Expand All @@ -14,6 +19,9 @@
import uk.gov.justice.services.messaging.Envelope;
import uk.gov.justice.services.messaging.JsonEnvelope;

import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Pattern;

import javax.inject.Inject;
Expand All @@ -24,6 +32,7 @@ public class InitiateCourtApplicationProceedingsCommandApi {

private static final Pattern URN_PATTERN = Pattern.compile("^[A-Z0-9]{11}$");
private static final String LINK_TYPE = "linkType";
public static final String COURT_APPLICATION = "courtApplication";

@Inject
private Sender sender;
Expand All @@ -38,17 +47,46 @@ public void initiateCourtApplicationProceedings(final JsonEnvelope command) {
throw new ForbiddenRequestException("User is not authorised to use this application type!");
}

validateInputsForApplication(command.payloadAsJsonObject());
validateInputsForApplication(command);

this.sender.send(Envelope.envelopeFrom(metadataFrom(command.metadata()).withName("progression.command.initiate-court-proceedings-for-application").build(),
command.payloadAsJsonObject()));
}

private void validateInputsForApplication(final JsonObject jsonObject) {
final JsonObject courtApplication = jsonObject.getJsonObject("courtApplication");
private void validateDefaultHearingType(final JsonEnvelope command) {
final JsonObject payload = command.payloadAsJsonObject();
final JsonObject courtApplication = payload.getJsonObject(COURT_APPLICATION);
if (!standaloneApplication(courtApplication)) {
return;
}

final String applicationTypeId = courtApplication.getJsonObject("type").getString("id");
final List<UUID> allowedHearingTypes = getAllowedHearingTypes(command.metadata(), requester, applicationTypeId);
if (isNotEmpty(allowedHearingTypes)) {
final Optional<UUID> submittedHearingTypeId = submittedHearingTypeId(payload);
if (!submittedHearingTypeId.isPresent() || !allowedHearingTypes.contains(submittedHearingTypeId.get())) {
throw new BadRequestException("Hearing type must be one of the allowed hearing types for this application type!");
}
}
}

private Optional<UUID> submittedHearingTypeId(final JsonObject payload) {
if (!payload.containsKey("courtHearing")) {
return empty();
}
final JsonObject courtHearing = payload.getJsonObject("courtHearing");
if (!courtHearing.containsKey("hearingType")) {
return empty();
}
return of(fromString(courtHearing.getJsonObject("hearingType").getString("id")));
}

private void validateInputsForApplication(final JsonEnvelope command) {
final JsonObject courtApplication = command.payloadAsJsonObject().getJsonObject(COURT_APPLICATION);
if (standaloneApplication(courtApplication) && courtApplication.containsKey("applicationReference") && isNotValidUrn(courtApplication.getString("applicationReference"))) {
throw new BadRequestException("Entered URN is not valid!");
}
validateDefaultHearingType(command);
}

private boolean standaloneApplication(final JsonObject courtApplication) {
Expand All @@ -60,7 +98,7 @@ private boolean isNotValidUrn(final String applicationReference) {
}

private boolean isUserNotAuthorised(final JsonEnvelope command) {
final String applicationTypeCode = command.payloadAsJsonObject().getJsonObject("courtApplication").getJsonObject("type").getString("code");
final String applicationTypeCode = command.payloadAsJsonObject().getJsonObject(COURT_APPLICATION).getJsonObject("type").getString("code");
return !isUserHasPermissionForApplicationTypeCode(command.metadata(), requester, applicationTypeCode);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.moj.cpp.progression.command.api;

import static java.lang.String.format;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static java.util.UUID.fromString;
import static javax.json.Json.createObjectBuilder;
Expand All @@ -9,6 +10,7 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import uk.gov.justice.services.core.requester.Requester;
import uk.gov.justice.services.messaging.Envelope;
import uk.gov.justice.services.messaging.JsonEnvelope;
Expand All @@ -20,12 +22,14 @@

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;

public class UserDetailsLoader {
Expand All @@ -37,6 +41,8 @@ public class UserDetailsLoader {
public static final String TARGET = "target";
public static final String OBJECT = "object";
public static final String ACTION = "action";
public static final String ACTIVE = "active";
public static final String HEARING_TYPE = "HearingType";
public static final String ORGANISATION_ID = "organisationId";
public static final String ORGANISATION_NAME = "organisationName";
public static final String USER_ID_NOT_SUPPLIED_FOR_THE_USER_GROUPS_LOOK_UP = "User id Not Supplied for the UserGroups look up";
Expand Down Expand Up @@ -69,7 +75,7 @@ public List<Permission> getPermissions(final Metadata metadata, final Requester
final JsonEnvelope requestEnvelope = envelopeFrom(metadataWithActionName, getOrganisationForUserRequest);
final Envelope<JsonObject> response = requester.requestAsAdmin(requestEnvelope, JsonObject.class);

if (!response.payload().containsKey(PERMISSIONS)) {
if (!response.payload().containsKey(PERMISSIONS)) {
return Collections.emptyList();
}
final JsonArray permissionsJsonArray = response.payload().getJsonArray(PERMISSIONS);
Expand All @@ -79,7 +85,7 @@ public List<Permission> getPermissions(final Metadata metadata, final Requester
}

return permissionsJsonArray.stream()
.map(p -> (JsonObject)p)
.map(p -> (JsonObject) p)
.map(permission ->
Permission.permission()
.withAction(JsonObjects.getString(permission, ACTION).orElse(null))
Expand All @@ -90,8 +96,49 @@ public List<Permission> getPermissions(final Metadata metadata, final Requester
).collect(Collectors.toList());
}

public static List<UUID> getAllowedHearingTypes(final Metadata metadata, final Requester requester, final String applicationTypeId) {
final JsonObject request = Json.createObjectBuilder()
.add(OBJECT, HEARING_TYPE)
.add(SOURCE, applicationTypeId)
.build();
final MetadataBuilder metadataWithActionName = Envelope.metadataFrom(metadata).withName("usersgroups.permissions");

final JsonEnvelope requestEnvelope = envelopeFrom(metadataWithActionName, request);
final Envelope<JsonObject> response = requester.requestAsAdmin(requestEnvelope, JsonObject.class);

final JsonObject payload = response.payload();
if (isNull(payload) || !payload.containsKey(PERMISSIONS)) {
return Collections.emptyList();
}
final JsonArray permissionsJsonArray = payload.getJsonArray(PERMISSIONS);
if (isNull(permissionsJsonArray)) {
return Collections.emptyList();
}

return permissionsJsonArray.stream()
.map(p -> (JsonObject) p)
.filter(UserDetailsLoader::isActive)
.map(permission -> getNullableUUID(permission, TARGET))
.filter(Objects::nonNull)
.toList();
}

private static boolean isActive(final JsonObject permission) {
if (!permission.containsKey(ACTIVE)) {
return false;
}
final JsonValue value = permission.get(ACTIVE);
if (value.getValueType() == JsonValue.ValueType.TRUE) {
return true;
}
if (value.getValueType() == JsonValue.ValueType.STRING) {
return Boolean.parseBoolean(((JsonString) value).getString());
}
return false;
}

private static UUID getNullableUUID(final JsonObject permission, final String attribute) {
final String uuidString = JsonObjects.getString( permission, attribute).orElse(null);
final String uuidString = JsonObjects.getString(permission, attribute).orElse(null);
if (nonNull(uuidString)) {
return fromString(uuidString);
} else {
Expand All @@ -110,7 +157,7 @@ protected UserOrganisationDetails getOrganisationDetailsForUser(final Envelope<?
final JsonEnvelope usersAndGroupsRequestEnvelope = envelopeFrom(requestEnvelope.metadata(), requestEnvelope.payload());
final Envelope<JsonObject> response = requester.requestAsAdmin(usersAndGroupsRequestEnvelope, JsonObject.class);
final JsonObject organisationDetails = response.payload();
if(nonNull(organisationDetails) && organisationDetails.containsKey(ORGANISATION_ID)) {
if (nonNull(organisationDetails) && organisationDetails.containsKey(ORGANISATION_ID)) {
return new UserOrganisationDetails(fromString(organisationDetails.getString(ORGANISATION_ID)),
organisationDetails.getString(ORGANISATION_NAME));
}
Expand All @@ -123,7 +170,7 @@ public boolean isPermitted(final JsonEnvelope query, final Requester requester)
.orElseThrow(() -> new IllegalStateException(USER_ID_NOT_SUPPLIED_FOR_THE_USER_GROUPS_LOOK_UP));
final UserOrganisationDetails organisationDetailsForUser = getOrganisationDetailsForUser(query, requester, userId);
final List<Permission> permissions = getPermissions(query.metadata(), requester, query.payloadAsJsonObject().getString(DEFENDANT_ID));
if(permissions.isEmpty()) {
if (permissions.isEmpty()) {
return false;
}

Expand Down
Loading
Loading