diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java index 5e28314c..4f2f0d98 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccess.java @@ -1,5 +1,7 @@ package uk.gov.moj.cpp.accesscontrol.sjp.providers; +import java.util.List; + import org.apache.commons.lang3.StringUtils; public class ProsecutingAuthorityAccess { @@ -11,10 +13,17 @@ public class ProsecutingAuthorityAccess { private String prosecutingAuthority; + private List agentProsecutorAuthorityAccess; + private ProsecutingAuthorityAccess(final String prosecutingAuthority) { this.prosecutingAuthority = prosecutingAuthority; } + private ProsecutingAuthorityAccess(final String prosecutingAuthority, final List agentProsecutorAuthorityAccess) { + this.prosecutingAuthority = prosecutingAuthority; + this.agentProsecutorAuthorityAccess = agentProsecutorAuthorityAccess; + } + public static ProsecutingAuthorityAccess of(final String prosecutingAuthority) { if (StringUtils.isEmpty(prosecutingAuthority)) { @@ -26,13 +35,31 @@ public static ProsecutingAuthorityAccess of(final String prosecutingAuthority) { return new ProsecutingAuthorityAccess(prosecutingAuthority); } + public static ProsecutingAuthorityAccess of(final String prosecutingAuthority, final List agentProsecutorAuthorityAccess) { + + if (StringUtils.isEmpty(prosecutingAuthority)) { + NONE.agentProsecutorAuthorityAccess = agentProsecutorAuthorityAccess; + return NONE; + } else if (prosecutingAuthority.equals(ALL.getProsecutingAuthority())) { + ALL.agentProsecutorAuthorityAccess = agentProsecutorAuthorityAccess; + return ALL; + } + + return new ProsecutingAuthorityAccess(prosecutingAuthority, agentProsecutorAuthorityAccess); + } + public String getProsecutingAuthority() { return prosecutingAuthority; } + public List getAgentProsecutorAuthorityAccess() { + return agentProsecutorAuthorityAccess; + } + public boolean hasAccess(final String prosecutingAuthority) { return ALL.getProsecutingAuthority().equals(this.getProsecutingAuthority()) || (this.getProsecutingAuthority() != null && - this.getProsecutingAuthority().equals(prosecutingAuthority)); + this.getProsecutingAuthority().equals(prosecutingAuthority)) || + (agentProsecutorAuthorityAccess != null && agentProsecutorAuthorityAccess.contains(prosecutingAuthority)); } } diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java index a5b8a731..97f2dc0e 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/main/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityProvider.java @@ -13,6 +13,11 @@ import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonValue; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + import static java.lang.Boolean.valueOf; import static uk.gov.moj.cpp.accesscontrol.drools.constants.AccessControlFrameworkComponent.ACCESS_CONTROL; import static uk.gov.moj.cpp.accesscontrol.sjp.providers.SjpProvider.jsonBuilderFactory; @@ -62,7 +67,15 @@ public ProsecutingAuthorityAccess getCurrentUsersProsecutingAuthorityAccess(fina private ProsecutingAuthorityAccess buildFromResponseJson(final JsonObject responsePayload) { - return ProsecutingAuthorityAccess.of(responsePayload.getString("prosecutingAuthorityAccess", null)); + final List agentProsecutors = Optional + .ofNullable(responsePayload.getJsonArray("agentProsecutorAuthorityAccess")) + .map(agentAccess -> agentAccess.getValuesAs(JsonObject.class) + .stream() + .map(agent -> agent.getString("prosecutingAuthority")) + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); + + return ProsecutingAuthorityAccess.of(responsePayload.getString("prosecutingAuthorityAccess", null), agentProsecutors); } private JsonValue buildRequestPayload(final JsonEnvelope envelope) { diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java index 267409b8..66d3e8ec 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/src/test/java/uk/gov/moj/cpp/accesscontrol/sjp/providers/ProsecutingAuthorityAccessTest.java @@ -4,6 +4,8 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; +import java.util.List; + import org.junit.jupiter.api.Test; public class ProsecutingAuthorityAccessTest { @@ -43,6 +45,20 @@ public void shouldReturnFalseForInvalidProsecutingAuthorityAccess() { assertThat(prosecutingAuthorityAccess.hasAccess(""), is(false)); } + @Test + public void shouldGrantAccessViaAgentProsecutorAuthorityAccess() { + + final ProsecutingAuthorityAccess prosecutingAuthorityAccess = + ProsecutingAuthorityAccess.of(PROSECUTOR, List.of("AGENT1", "AGENT2")); + + assertThat(prosecutingAuthorityAccess.getProsecutingAuthority(), is(PROSECUTOR)); + assertThat(prosecutingAuthorityAccess.getAgentProsecutorAuthorityAccess(), is(List.of("AGENT1", "AGENT2"))); + assertThat(prosecutingAuthorityAccess.hasAccess(PROSECUTOR), is(true)); + assertThat(prosecutingAuthorityAccess.hasAccess("AGENT1"), is(true)); + assertThat(prosecutingAuthorityAccess.hasAccess("AGENT2"), is(true)); + assertThat(prosecutingAuthorityAccess.hasAccess("OTHER"), is(false)); + } + @Test public void shouldBuildAllProsecutingAuthorityAccess() {