Skip to content

Commit 32d6815

Browse files
committed
Merge branch 'ccd_5344' into combined_srt_changes
2 parents 3bd1b81 + 4b247db commit 32d6815

30 files changed

+900
-239
lines changed

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ dependencies {
315315
testRuntimeOnly "org.junit.platform:junit-platform-commons:1.8.1"
316316
testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.6.0'
317317
testImplementation group:'org.mockito', name: 'mockito-junit-jupiter', version:'3.6.0'
318+
testImplementation 'org.mockito:mockito-inline:4.11.0'
318319
testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: powermockVersion
319320
testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: powermockVersion
320321
testImplementation group: 'com.xebialabs.restito', name: 'restito', version: '0.9.3'

src/aat/resources/features/F-1015 - Start Case Event TTL/F-1015.feature

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Feature: F-1015: Update Case - Start Case Event - Update Code for TTL
2424
And the response has all other details as expected
2525
And the response [contains the TTL.SystemTTL for the case, that has been set to 20 days from today]
2626

27-
@S-1015.1.repeat
27+
@S-1015.1.repeat
2828
Scenario: TTLIncrement is set to "20" for the Case Event and Start Event is invoked on v1_external#/case-details-endpoint/startEventForCaseworkerUsingGET
2929
Given a user with [an active profile in CCD],
3030
And a successful call [to create a case] as in [F-1015_CreateCasePreRequisiteCaseworker_noTTL]
@@ -461,7 +461,7 @@ Feature: F-1015: Update Case - Start Case Event - Update Code for TTL
461461
And the request [has a TTLIncrement of 20 days configured]
462462
And the request [is configured to trigger an About to Start callback that changes TTL.OverrideTTL]
463463
And it is submitted to call the [Start event creation process to update a case (v1_int caseworker)] operation of [CCD Data Store]
464-
464+
465465
Then a negative response is received
466466
And the response has all other details as expected
467467
And the response [contains the error message indicating unauthorised change to the TTL values]

src/aat/resources/features/F-1017 - Validate Event to Update TTL/F-1017.feature

+4-4
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ Feature: F-1017: Validate Event to Update TTL
252252
# #CCD-3535 & #CCD-3562: Trigger a mid-event callback that makes permitted changes to the TTL values: v1_external#/citizen/case-details-endpoint/validateCaseDetailsUsingPOST_1
253253
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
254254

255-
@S-1017.21 #CCD-3535
255+
@S-1017.21 @Ignore #CCD-3535
256256
Scenario: Trigger a mid event callback that changes TTL.Suspended (null -> missing). Mid Event is invoked on v1_external#/citizen/case-details-endpoint/validateCaseDetailsUsingPOST_1
257257
Given a user with [an active profile in CCD]
258258
And a user with [a caseworker with an active profile in CCD]
@@ -274,7 +274,7 @@ Feature: F-1017: Validate Event to Update TTL
274274
And the response [contains the TTL.OverrideTTL from the previouse data]
275275
And the response [does not contain the TTL.Suspended as removed by callback (null -> missing)]
276276

277-
@S-1017.22 #CCD-3535
277+
@S-1017.22 @Ignore #CCD-3535
278278
Scenario: Trigger a mid event callback that changes TTL.Suspended (No -> NO). Mid Event is invoked on v1_external#/citizen/case-details-endpoint/validateCaseDetailsUsingPOST_1
279279
Given a user with [an active profile in CCD]
280280
And a user with [a caseworker with an active profile in CCD]
@@ -297,7 +297,7 @@ Feature: F-1017: Validate Event to Update TTL
297297
And the response [does not contain the TTL.OverrideTTL as removed by callback (null -> missing)]
298298
And the response [contains the adjusted TTL.Suspended from the callback (No -> NO)]
299299

300-
@S-1017.23 #CCD-3535
300+
@S-1017.23 @Ignore #CCD-3535
301301
Scenario: Trigger a mid event callback that changes TTL.Suspended (Yes -> YES). Mid Event is invoked on v1_external#/citizen/case-details-endpoint/validateCaseDetailsUsingPOST_1
302302
Given a user with [an active profile in CCD]
303303
And a user with [a caseworker with an active profile in CCD]
@@ -321,7 +321,7 @@ Feature: F-1017: Validate Event to Update TTL
321321
And the response [contains the adjusted TTL.Suspended from the callback (Yes -> YES)]
322322

323323

324-
@S-1017.25 #CCD-3562
324+
@S-1017.25 @Ignore #CCD-3562
325325
Scenario: Trigger a mid event callback that has TTL missing. Mid Event is invoked on v1_external#/citizen/case-details-endpoint/validateCaseDetailsUsingPOST_1
326326
Given a user with [an active profile in CCD]
327327
And a successful call [to create a case] as in [CreateCase_TTLCaseType_PreRequisiteCitizen]

src/aat/resources/features/F-1017 - Validate Event to Update TTL/S-1017.21.td.json

-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@
6262
"expectedResponse": {
6363
"body": {
6464
"data": {
65-
"TTL": {
66-
"SystemTTL": "${[scenarioContext][customValues][dateTwentyDaysFromToday]}",
67-
"OverrideTTL": "${[scenarioContext][customValues][dateGreaterThanTTLGuardDate]}"
68-
},
6965
"TextField" : "[[ANYTHING_PRESENT]]"
7066
}
7167
}

src/aat/resources/features/F-1017 - Validate Event to Update TTL/S-1017.22.td.json

-4
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@
6363
"expectedResponse": {
6464
"body": {
6565
"data": {
66-
"TTL": {
67-
"SystemTTL": "${[scenarioContext][customValues][dateTwentyDaysFromToday]}",
68-
"Suspended": "NO"
69-
},
7066
"TextField" : "[[ANYTHING_PRESENT]]"
7167
}
7268
}

src/aat/resources/features/F-1017 - Validate Event to Update TTL/S-1017.23.td.json

-4
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@
6363
"expectedResponse": {
6464
"body": {
6565
"data": {
66-
"TTL": {
67-
"SystemTTL": "${[scenarioContext][customValues][dateTwentyDaysFromToday]}",
68-
"Suspended": "YES"
69-
},
7066
"TextField" : "[[ANYTHING_PRESENT]]"
7167
}
7268
}

src/aat/resources/features/F-1017 - Validate Event to Update TTL/S-1017.25.td.json

-5
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,6 @@
5252
"expectedResponse": {
5353
"body": {
5454
"data": {
55-
"TTL" : {
56-
"SystemTTL" : "${[scenarioContext][customValues][dateTwentyDaysFromToday]}",
57-
"OverrideTTL" : null,
58-
"Suspended" : "No"
59-
},
6055
"TextField" : "[[ANYTHING_PRESENT]]"
6156
}
6257
}

src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/ContractTestCreateCaseOperation.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
import uk.gov.hmcts.ccd.domain.service.caselinking.CaseLinkService;
1919
import uk.gov.hmcts.ccd.domain.service.common.CaseDataService;
2020
import uk.gov.hmcts.ccd.domain.service.common.CasePostStateService;
21-
import uk.gov.hmcts.ccd.domain.service.common.CaseTypeService;
2221
import uk.gov.hmcts.ccd.domain.service.common.EventTriggerService;
2322
import uk.gov.hmcts.ccd.domain.service.createcase.DefaultCreateCaseOperation;
2423
import uk.gov.hmcts.ccd.domain.service.createcase.SubmitCaseTransaction;
2524
import uk.gov.hmcts.ccd.domain.service.processor.GlobalSearchProcessorService;
2625
import uk.gov.hmcts.ccd.domain.service.stdapi.CallbackInvoker;
2726
import uk.gov.hmcts.ccd.domain.service.supplementarydata.SupplementaryDataUpdateOperation;
2827
import uk.gov.hmcts.ccd.domain.service.validate.CaseDataIssueLogger;
28+
import uk.gov.hmcts.ccd.domain.service.validate.DefaultValidateCaseFieldsOperation;
2929
import uk.gov.hmcts.ccd.domain.service.validate.ValidateCaseFieldsOperation;
3030
import uk.gov.hmcts.ccd.domain.types.sanitiser.CaseSanitiser;
3131

@@ -47,8 +47,9 @@ public ContractTestCreateCaseOperation(@Qualifier(DefaultUserRepository.QUALIFIE
4747
EventTokenService eventTokenService,
4848
CaseDataService caseDataService,
4949
SubmitCaseTransaction submitCaseTransaction,
50-
CaseSanitiser caseSanitiser, CaseTypeService caseTypeService,
50+
CaseSanitiser caseSanitiser,
5151
CallbackInvoker callbackInvoker,
52+
@Qualifier(DefaultValidateCaseFieldsOperation.QUALIFIER)
5253
ValidateCaseFieldsOperation validateCaseFieldsOperation,
5354
CasePostStateService casePostStateService,
5455
@Qualifier(DefaultDraftGateway.QUALIFIER) DraftGateway draftGateway,
@@ -61,7 +62,7 @@ public ContractTestCreateCaseOperation(@Qualifier(DefaultUserRepository.QUALIFIE
6162
CaseLinkService caseLinkService,
6263
TimeToLiveService timeToLiveService) {
6364
super(userRepository, caseDefinitionRepository, eventTriggerService, eventTokenService, caseDataService,
64-
submitCaseTransaction, caseSanitiser, caseTypeService, callbackInvoker, validateCaseFieldsOperation,
65+
submitCaseTransaction, caseSanitiser, callbackInvoker, validateCaseFieldsOperation,
6566
casePostStateService, draftGateway, caseDataIssueLogger, globalSearchProcessorService,
6667
supplementaryDataUpdateOperation, supplementaryDataValidator, caseLinkService, timeToLiveService);
6768
this.contractTestSecurityUtils = contractTestSecurityUtils;

src/main/java/uk/gov/hmcts/ccd/config/JacksonUtils.java

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
public final class JacksonUtils {
2929

30+
public static final String DATA = "data";
31+
3032
private JacksonUtils() {
3133
}
3234

@@ -198,4 +200,10 @@ private static String getValue(@NonNull JsonNode jsonNode) {
198200
}
199201
return returnValue;
200202
}
203+
204+
public static Map<String, JsonNode> convertValueInDataField(Object from) {
205+
Map<String, JsonNode> dataNode = new HashMap<>();
206+
dataNode.put(DATA, MAPPER.valueToTree(convertValue(from)));
207+
return dataNode;
208+
}
201209
}

src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperation.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@
3030
import uk.gov.hmcts.ccd.domain.service.caselinking.CaseLinkService;
3131
import uk.gov.hmcts.ccd.domain.service.common.CaseDataService;
3232
import uk.gov.hmcts.ccd.domain.service.common.CasePostStateService;
33-
import uk.gov.hmcts.ccd.domain.service.common.CaseTypeService;
3433
import uk.gov.hmcts.ccd.domain.service.common.EventTriggerService;
3534
import uk.gov.hmcts.ccd.domain.service.processor.GlobalSearchProcessorService;
3635
import uk.gov.hmcts.ccd.domain.service.stdapi.CallbackInvoker;
3736
import uk.gov.hmcts.ccd.domain.service.supplementarydata.SupplementaryDataUpdateOperation;
3837
import uk.gov.hmcts.ccd.domain.service.validate.CaseDataIssueLogger;
38+
import uk.gov.hmcts.ccd.domain.service.validate.DefaultValidateCaseFieldsOperation;
39+
import uk.gov.hmcts.ccd.domain.service.validate.OperationContext;
3940
import uk.gov.hmcts.ccd.domain.service.validate.ValidateCaseFieldsOperation;
4041
import uk.gov.hmcts.ccd.domain.types.sanitiser.CaseSanitiser;
4142
import uk.gov.hmcts.ccd.endpoint.exceptions.CallbackException;
@@ -58,7 +59,6 @@ public class DefaultCreateCaseOperation implements CreateCaseOperation {
5859
private final CaseDataService caseDataService;
5960
private final SubmitCaseTransaction submitCaseTransaction;
6061
private final CaseSanitiser caseSanitiser;
61-
private final CaseTypeService caseTypeService;
6262
private final CallbackInvoker callbackInvoker;
6363
private final ValidateCaseFieldsOperation validateCaseFieldsOperation;
6464
private final DraftGateway draftGateway;
@@ -79,8 +79,8 @@ public DefaultCreateCaseOperation(@Qualifier(CachedUserRepository.QUALIFIER) fin
7979
final CaseDataService caseDataService,
8080
final SubmitCaseTransaction submitCaseTransaction,
8181
final CaseSanitiser caseSanitiser,
82-
final CaseTypeService caseTypeService,
8382
final CallbackInvoker callbackInvoker,
83+
@Qualifier(DefaultValidateCaseFieldsOperation.QUALIFIER)
8484
final ValidateCaseFieldsOperation validateCaseFieldsOperation,
8585
final CasePostStateService casePostStateService,
8686
@Qualifier(CachedDraftGateway.QUALIFIER) final DraftGateway draftGateway,
@@ -97,7 +97,6 @@ public DefaultCreateCaseOperation(@Qualifier(CachedUserRepository.QUALIFIER) fin
9797
this.eventTokenService = eventTokenService;
9898
this.submitCaseTransaction = submitCaseTransaction;
9999
this.caseSanitiser = caseSanitiser;
100-
this.caseTypeService = caseTypeService;
101100
this.caseDataService = caseDataService;
102101
this.callbackInvoker = callbackInvoker;
103102
this.validateCaseFieldsOperation = validateCaseFieldsOperation;
@@ -144,7 +143,7 @@ public CaseDetails createCaseDetails(final String caseTypeId,
144143
caseTypeDefinition.getJurisdictionDefinition(),
145144
caseTypeDefinition);
146145

147-
validateCaseFieldsOperation.validateCaseDetails(caseTypeId, caseDataContent);
146+
validateCaseFieldsOperation.validateCaseDetails(new OperationContext(caseTypeId, caseDataContent));
148147

149148
final CaseDetails newCaseDetails = new CaseDetails();
150149

src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventService.java

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import uk.gov.hmcts.ccd.domain.service.stdapi.AboutToSubmitCallbackResponse;
4747
import uk.gov.hmcts.ccd.domain.service.stdapi.CallbackInvoker;
4848
import uk.gov.hmcts.ccd.domain.service.validate.CaseDataIssueLogger;
49+
import uk.gov.hmcts.ccd.domain.service.validate.DefaultValidateCaseFieldsOperation;
4950
import uk.gov.hmcts.ccd.domain.service.validate.ValidateCaseFieldsOperation;
5051
import uk.gov.hmcts.ccd.domain.types.sanitiser.CaseSanitiser;
5152
import uk.gov.hmcts.ccd.endpoint.exceptions.BadRequestException;
@@ -118,6 +119,7 @@ public CreateCaseEventService(@Qualifier(CachedUserRepository.QUALIFIER) final U
118119
final CallbackInvoker callbackInvoker,
119120
final UIDService uidService,
120121
final SecurityClassificationServiceImpl securityClassificationService,
122+
@Qualifier(DefaultValidateCaseFieldsOperation.QUALIFIER)
121123
final ValidateCaseFieldsOperation validateCaseFieldsOperation,
122124
final UserAuthorisation userAuthorisation,
123125
final FieldProcessorService fieldProcessorService,

src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallback.java

+4-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package uk.gov.hmcts.ccd.domain.service.createevent;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
5-
import com.fasterxml.jackson.databind.node.ObjectNode;
4+
65
import java.util.Map;
76
import java.util.Optional;
87
import java.util.Set;
@@ -52,9 +51,7 @@ public MidEventCallback(CallbackInvoker callbackInvoker,
5251
}
5352

5453
@Transactional
55-
public JsonNode invoke(String caseTypeId,
56-
CaseDataContent content,
57-
String pageId) {
54+
public Map<String, JsonNode> invoke(String caseTypeId, CaseDataContent content, String pageId) {
5855
if (!isBlank(pageId)) {
5956
Event event = content.getEvent();
6057
final CaseTypeDefinition caseTypeDefinition = getCaseType(caseTypeId);
@@ -91,11 +88,10 @@ public JsonNode invoke(String caseTypeId,
9188
caseDetailsBefore,
9289
currentOrNewCaseDetails,
9390
content.getIgnoreWarning());
94-
95-
return dataJsonNode(caseDetailsFromMidEventCallback.getData());
91+
return caseDetailsFromMidEventCallback.getData();
9692
}
9793
}
98-
return dataJsonNode(content.getData());
94+
return content.getData();
9995
}
10096

10197
private void removeNextPageFieldData(CaseDetails currentCaseDetails, Integer order,
@@ -112,13 +108,6 @@ private void removeNextPageFieldData(CaseDetails currentCaseDetails, Integer ord
112108
}
113109
}
114110

115-
private JsonNode dataJsonNode(Map<String, JsonNode> data) {
116-
ObjectMapper mapper = new ObjectMapper();
117-
ObjectNode objectNode = mapper.createObjectNode();
118-
objectNode.set("data", mapper.valueToTree(data));
119-
return objectNode;
120-
}
121-
122111
private CaseTypeDefinition getCaseType(String caseTypeId) {
123112
final CaseTypeDefinition caseTypeDefinition = caseDefinitionRepository.getCaseType(caseTypeId);
124113
if (caseTypeDefinition == null) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package uk.gov.hmcts.ccd.domain.service.validate;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.springframework.beans.factory.annotation.Qualifier;
7+
import org.springframework.stereotype.Service;
8+
import uk.gov.hmcts.ccd.config.JacksonUtils;
9+
import uk.gov.hmcts.ccd.data.definition.CachedCaseDefinitionRepository;
10+
import uk.gov.hmcts.ccd.data.definition.CaseDefinitionRepository;
11+
import uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.AccessProfile;
12+
import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition;
13+
import uk.gov.hmcts.ccd.domain.model.std.CaseDataContent;
14+
import uk.gov.hmcts.ccd.domain.service.common.AccessControlService;
15+
import uk.gov.hmcts.ccd.domain.service.common.CaseAccessService;
16+
import uk.gov.hmcts.ccd.endpoint.exceptions.ValidationException;
17+
18+
import java.util.Map;
19+
import java.util.Set;
20+
21+
import static com.google.common.collect.Maps.newHashMap;
22+
import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_READ;
23+
24+
@Service
25+
@Slf4j
26+
@Qualifier(AuthorisedValidateCaseFieldsOperation.QUALIFIER)
27+
public class AuthorisedValidateCaseFieldsOperation implements ValidateCaseFieldsOperation {
28+
public static final String QUALIFIER = "authorised";
29+
30+
private final AccessControlService accessControlService;
31+
private final CaseDefinitionRepository caseDefinitionRepository;
32+
private final CaseAccessService caseAccessService;
33+
private final ValidateCaseFieldsOperation validateCaseFieldsOperation;
34+
35+
public AuthorisedValidateCaseFieldsOperation(AccessControlService accessControlService,
36+
@Qualifier(CachedCaseDefinitionRepository.QUALIFIER)
37+
CaseDefinitionRepository caseDefinitionRepository,
38+
CaseAccessService caseAccessService,
39+
@Qualifier(ClassifiedValidateCaseFieldsOperation.QUALIFIER)
40+
ValidateCaseFieldsOperation validateCaseFieldsOperation) {
41+
this.accessControlService = accessControlService;
42+
this.caseDefinitionRepository = caseDefinitionRepository;
43+
this.caseAccessService = caseAccessService;
44+
this.validateCaseFieldsOperation = validateCaseFieldsOperation;
45+
}
46+
47+
@Override
48+
public Map<String, JsonNode> validateCaseDetails(OperationContext operationContext) {
49+
validateCaseFieldsOperation.validateCaseDetails(operationContext);
50+
51+
CaseDataContent content = operationContext.content();
52+
String caseTypeId = operationContext.caseTypeId();
53+
54+
String caseReference = content.getCaseReference();
55+
Set<AccessProfile> accessProfiles = StringUtils.isNotEmpty(caseReference)
56+
? caseAccessService.getAccessProfilesByCaseReference(caseReference) :
57+
caseAccessService.getCaseCreationRoles(caseTypeId);
58+
59+
verifyReadAccess(caseTypeId, content, accessProfiles);
60+
61+
return content.getData();
62+
}
63+
64+
@Override
65+
public void validateData(Map<String, JsonNode> data, CaseTypeDefinition caseTypeDefinition,
66+
CaseDataContent content) {
67+
validateCaseFieldsOperation.validateData(data, caseTypeDefinition, content);
68+
}
69+
70+
private void verifyReadAccess(final String caseTypeId, CaseDataContent content, Set<AccessProfile> accessProfiles) {
71+
final CaseTypeDefinition caseTypeDefinition = getCaseDefinitionType(caseTypeId);
72+
73+
if (content.getData() == null) {
74+
content.setData(newHashMap());
75+
return;
76+
}
77+
78+
if (!accessControlService.canAccessCaseTypeWithCriteria(
79+
caseTypeDefinition,
80+
accessProfiles,
81+
CAN_READ)) {
82+
content.setData(newHashMap());
83+
return;
84+
}
85+
86+
content.setData(JacksonUtils.convertValueInDataField(
87+
accessControlService.filterCaseFieldsByAccess(
88+
JacksonUtils.convertValueJsonNode(content.getData()),
89+
caseTypeDefinition.getCaseFieldDefinitions(),
90+
accessProfiles,
91+
CAN_READ,
92+
false)));
93+
}
94+
95+
private CaseTypeDefinition getCaseDefinitionType(String caseTypeId) {
96+
final CaseTypeDefinition caseTypeDefinition = caseDefinitionRepository.getCaseType(caseTypeId);
97+
if (caseTypeDefinition == null) {
98+
throw new ValidationException("Cannot find case type definition for " + caseTypeId);
99+
}
100+
return caseTypeDefinition;
101+
}
102+
}

0 commit comments

Comments
 (0)