Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
4168386
DTSPB-4663 fix CCD Concurrency in SS
MarcusHMCTS Apr 14, 2025
423ca88
DTSPB-4663 fix Integration Tests
MarcusHMCTS Apr 14, 2025
56f20ce
DTSPB-4663 fix SubmitServiceImplTest
MarcusHMCTS Apr 14, 2025
43513a3
DTSPB-4663 fix SubmitServiceImplTest
MarcusHMCTS Apr 14, 2025
52103f9
DTSPB-4663 fix SubmitServiceImplTest typo style
MarcusHMCTS Apr 14, 2025
07ff449
DTSPB-4663 fix FormsFunctionalTests.java shouldSaveFormSuccessfully
MarcusHMCTS Apr 14, 2025
4b2bfc6
Merge branch 'master' into DTSPB-4663_Fix-CCD-concurrency-issue-in-Su…
MarcusHMCTS Apr 15, 2025
072c3e7
DTSPB-4663 add debug log
MarcusHMCTS Apr 15, 2025
728d493
DTSPB-4663 add debug log
MarcusHMCTS Apr 15, 2025
ab803fe
DTSPB-4663 pointing to ss pr-1092
MarcusHMCTS Apr 15, 2025
b931519
Bumping chart version/ fixing aliases
hmcts-jenkins-j-to-z[bot] Apr 15, 2025
f794b87
DTSPB-4663 fix history typo error for /cases/initiate
MarcusHMCTS Apr 16, 2025
32e007c
Merge remote-tracking branch 'origin/DTSPB-4663_Fix-CCD-concurrency-i…
MarcusHMCTS Apr 16, 2025
eb979d0
Merge branch 'master' into DTSPB-4663_Fix-CCD-concurrency-issue-in-Su…
MarcusHMCTS Apr 17, 2025
8633e98
DTSPB-4663 fix history typo error for /cases/initiate
MarcusHMCTS Apr 17, 2025
9764d4d
fix typo
FeliTam Apr 22, 2025
8675c83
Merge branch 'master' into DTSPB-4663_Fix-CCD-concurrency-issue-in-Su…
MarcusHMCTS May 7, 2025
c8c93ce
DTSPB-4663 update probate commons to 2.1.2
MarcusHMCTS May 7, 2025
1cb9e80
DTSPB-4663 update probate commons to 2.1.3
MarcusHMCTS May 9, 2025
11a5e10
DTSPB-4663 add lastModifiedDateTime to InvitationResult
MarcusHMCTS May 14, 2025
9f089cc
DTSPB-4663 fix IT Test
MarcusHMCTS May 14, 2025
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def versions = [
mapStruct : '1.3.0.Final',
pact_version : '4.1.34',
piTest : '1.19.1',
probateCommonsVersion : '2.1.0',
probateCommonsVersion : '2.1.4',
restAssured : '5.5.1',
serenity : '4.2.22',
serviceAuthProviderClient : '5.3.2',
Expand Down
2 changes: 1 addition & 1 deletion charts/probate-orchestrator-service/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apiVersion: v2
name: probate-orchestrator-service
home: https://github.com/hmcts/probate-orchestrator-service
version: 1.0.49
version: 1.0.50
description: HMCTS Probate Orchestrator Service
maintainers:
- name: HMCTS Probate Team
Expand Down
2 changes: 1 addition & 1 deletion charts/probate-orchestrator-service/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ java:
SERVICES_CORECASEDATA_BASEURL: "http://ccd-data-store-api-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal"
SERVICES_AUTH_PROVIDER_BASEURL: "http://rpe-service-auth-provider-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal"
AUTH_IDAM_CLIENT_BASEURL: "https://idam-api.{{ .Values.global.environment }}.platform.hmcts.net"
SUBMIT_SERVICE_API_URL: "http://probate-submit-service-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal"
SUBMIT_SERVICE_API_URL: "http://probate-submit-service-pr-1092-java"
BUSINESS_SERVICE_API_URL: "http://probate-business-service-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal"
BACK_OFFICE_API_URL: "http://probate-back-office-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal"
MAIL_JAVAMAILPROPERTIES_MAIL_SMTP_SSL_ENABLE: false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public void shouldSaveFormSuccessfully() {
.headers(utils.getCitizenHeaders())
.body(draftJsonStr)
.when()
.post(FORMS_CASES + caseId)
.post(FORMS_CASES + caseId + "/" + "2099-01-01T12:12:12.123")
.then()
.assertThat()
.statusCode(200)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import uk.gov.hmcts.reform.probate.model.payments.PaymentDto;

import java.math.BigDecimal;
import java.time.LocalDateTime;

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
Expand All @@ -40,6 +41,9 @@
public class FormsControllerIT {

private static final String EMAIL_ADDRESS = "1570130475566595";
private static final LocalDateTime LAST_MODIFIED_DATE_TIME = LocalDateTime.of(2018, 1, 1,
12, 12, 12).withNano(123 * 1_000_000);
private static final String LAST_MODIFIED_DATE_TIME_STRING = "2018-01-01T12:12:12.123";

private static final String FORMS_ENDPOINT = "/forms";
private static final String FORMS_CASE_ENDPOINT = "/forms/case";
Expand Down Expand Up @@ -105,27 +109,33 @@ public void setUp() throws Exception {

@Test
public void shouldSaveCaveatForm() throws Exception {
when(submitService.saveCase(eq(EMAIL_ADDRESS), eq(caveatForm))).thenReturn(caveatForm);
when(submitService.saveCase(eq(EMAIL_ADDRESS), eq(LAST_MODIFIED_DATE_TIME),
eq(caveatForm))).thenReturn(caveatForm);

mockMvc.perform(post(FORMS_CASE_ENDPOINT + "/" + EMAIL_ADDRESS)
mockMvc.perform(post(FORMS_CASE_ENDPOINT + "/" + EMAIL_ADDRESS
+ "/" + LAST_MODIFIED_DATE_TIME_STRING)
.content(caveatFormJsonStr)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json(caveatFormJsonStr, true));
verify(submitService, times(1)).saveCase(eq(EMAIL_ADDRESS), eq(caveatForm));
verify(submitService, times(1)).saveCase(eq(EMAIL_ADDRESS),
eq(LAST_MODIFIED_DATE_TIME), eq(caveatForm));
}

@Test
public void shouldSaveIntestacyForm() throws Exception {
when(submitService.saveCase(eq(EMAIL_ADDRESS), eq(intestacyForm))).thenReturn(intestacyForm);
when(submitService.saveCase(eq(EMAIL_ADDRESS), eq(LAST_MODIFIED_DATE_TIME),
eq(intestacyForm))).thenReturn(intestacyForm);

mockMvc.perform(post(FORMS_CASE_ENDPOINT + "/" + EMAIL_ADDRESS)
mockMvc.perform(post(FORMS_CASE_ENDPOINT + "/" + EMAIL_ADDRESS
+ "/" + LAST_MODIFIED_DATE_TIME_STRING)
.content(intestacyFormJsonStr)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json(intestacyFormJsonStr, true));

verify(submitService, times(1)).saveCase(eq(EMAIL_ADDRESS), eq(intestacyForm));
verify(submitService, times(1)).saveCase(eq(EMAIL_ADDRESS),
eq(LAST_MODIFIED_DATE_TIME), eq(intestacyForm));
}

@Test
Expand Down Expand Up @@ -154,7 +164,8 @@ public void shouldSubmitPaFormWithPayment() throws Exception {
.andExpect(status().isOk())
.andExpect(content().json(paFormJsonStr, true));

verify(submitService, times(1)).update(eq(EMAIL_ADDRESS), eq(ProbateType.PA), eq(paymentDto));
verify(submitService, times(1)).update(eq(EMAIL_ADDRESS),
eq(ProbateType.PA), eq(paymentDto));
}


Expand All @@ -172,7 +183,8 @@ public void shouldSubmitIntestacyFormWithPayment() throws Exception {
.andExpect(status().isOk())
.andExpect(content().json(paFormJsonStr, true));

verify(submitService, times(1)).update(eq("123456"), eq(ProbateType.INTESTACY), eq(paymentDto));
verify(submitService, times(1)).update(eq("123456"),
eq(ProbateType.INTESTACY), eq(paymentDto));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public void sendBilingualInvitation_withValidJson_shouldReturn200() throws Excep
.contentType(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE)))
.andExpect(status().isOk());
verify(businessService, times(1)).sendInvitations(eq(Arrays.asList(invitation)),
eq("someSessionId"), eq(Boolean.TRUE));
eq("someSessionId"), eq(Boolean.FALSE));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ ProbateCaseDetails saveCase(
);

@PostMapping(
value = "/cases/initate",
value = "/cases/initiate",
headers = CONTENT_TYPE + "=" + APPLICATION_JSON_VALUE
)
ProbateCaseDetails initiateCase(
Expand Down
16 changes: 11 additions & 5 deletions src/main/java/uk/gov/hmcts/probate/controller/FormsController.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,25 @@
import uk.gov.hmcts.reform.probate.model.forms.Form;
import uk.gov.hmcts.reform.probate.model.payments.PaymentDto;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Tag(name = "FormsController", description = "Forms API")
@RestController
@Slf4j
@RequiredArgsConstructor
public class FormsController {

private static final String FORMS_CASE_ENDPOINT = "/forms/case/{identifier}";
private static final String FORMS_SAVE_CASE_ENDPOINT = "/forms/case/{identifier}/{lastModifiedDateTime}";
private static final String FORMS_CASES_ENDPOINT = "/forms/cases";
private static final String FORMS_NEW_CASE_ENDPOINT = "/forms/newcase";
private static final String SUBMISSIONS_ENDPOINT = "/submissions";
private static final String FORMS_SUBMISSIONS_ENDPOINT = "/forms/{identifier}";
private static final String VALIDATIONS_ENDPOINT = "/validations";
private static final String PAYMENTS_ENDPOINT = "/payments";
private static final String MIGRATE_DATA_ENDPOINT = "/migrateData";

private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
private final SubmitService submitService;


Expand All @@ -61,13 +65,15 @@ public ResponseEntity<CaseSummaryHolder> initiateForm(@RequestParam("probateType
@ApiResponse(responseCode = "400", description = "Saving form failed"),
@ApiResponse(responseCode = "422", description = "Invalid or missing attribute")
})
@PostMapping(path = FORMS_CASE_ENDPOINT, consumes = MediaType.APPLICATION_JSON_VALUE,
@PostMapping(path = FORMS_SAVE_CASE_ENDPOINT, consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<Form> saveForm(@RequestBody Form form,
@PathVariable("identifier") String identifier) {
log.info("Save form called");
return new ResponseEntity<>(submitService.saveCase(identifier, form), HttpStatus.OK);
@PathVariable("identifier") String identifier,
@PathVariable("lastModifiedDateTime") String lastModifiedDateTime) {
log.info("Save form called with identifier {} lastModifiedDateTime {}", identifier, lastModifiedDateTime);
LocalDateTime lastModifiedDateTimeParsed = LocalDateTime.parse(lastModifiedDateTime, DATE_TIME_FORMAT);
return new ResponseEntity<>(submitService.saveCase(identifier,lastModifiedDateTimeParsed, form), HttpStatus.OK);
}

@Operation(summary = "Get form data", description = "Get form data")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,14 @@ public class InvitationController {
consumes = MediaType.APPLICATION_JSON_VALUE)
public InvitationsResult invite(@Valid @RequestBody List<Invitation> invitations,
@RequestHeader("Session-Id") String sessionId) {
return InvitationsResult.builder()
.invitations(businessService.sendInvitations(invitations, sessionId, Boolean.FALSE)).build();
return businessService.sendInvitations(invitations, sessionId, Boolean.FALSE);
}

@PostMapping(path = INVITE_BILINGUAL_URL,
consumes = MediaType.APPLICATION_JSON_VALUE)
public InvitationsResult inviteBilingual(@Valid @RequestBody List<Invitation> invitations,
@RequestHeader("Session-Id") String sessionId) {
return InvitationsResult.builder()
.invitations(businessService.sendInvitations(invitations, sessionId, Boolean.TRUE)).build();
return businessService.sendInvitations(invitations, sessionId, Boolean.FALSE);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
import uk.gov.hmcts.reform.probate.model.documents.LegalDeclaration;
import uk.gov.hmcts.reform.probate.model.multiapplicant.ExecutorNotification;
import uk.gov.hmcts.reform.probate.model.multiapplicant.Invitation;
import uk.gov.hmcts.reform.probate.model.multiapplicant.InvitationsResult;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -87,15 +89,15 @@ public String sendInvitation(Invitation invitation, String sessionId) {
(GrantOfRepresentationData) probateCaseDetails.getCaseData();
grantOfRepresentationData.setInvitationDetailsForExecutorApplying(invitation.getEmail(), invitationId,
invitation.getLeadExecutorName(), invitation.getExecutorName());
log.info("Updating case with invitation details");
updateCaseData(probateCaseDetails, invitation.getFormdataId());
return invitationId;
}


@Override
public List<Invitation> sendInvitations(List<Invitation> invitations, String sessionId, Boolean isBilingual) {
log.info("Send Invitations data ...calling businessServiceApi");
public InvitationsResult sendInvitations(List<Invitation> invitations, String sessionId, Boolean isBilingual) {
log.info("Send Invitations SSS data ...calling businessServiceApi");
LocalDateTime lastModifiedDateTime = null;
Optional<Invitation> optionalInvitation = invitations.stream().findFirst();
if (optionalInvitation.isPresent()) {
final ProbateCaseDetails probateCaseDetails =
Expand Down Expand Up @@ -126,7 +128,8 @@ public List<Invitation> sendInvitations(List<Invitation> invitations, String ses
log.info("Updating case with invitation details");
updateCaseData(probateCaseDetails, formDataId);
}
return invitations;
return InvitationsResult.builder()
.invitations(invitations).lastModifiedDateTime(lastModifiedDateTime).build();
}


Expand Down Expand Up @@ -337,11 +340,12 @@ private ProbateCaseDetails getProbateCaseDetails(String caseId) {
caseId, ProbateType.PA.getCaseType().name());
}

private void updateCaseData(ProbateCaseDetails probateCaseDetails, String formdataId) {
private LocalDateTime updateCaseData(ProbateCaseDetails probateCaseDetails, String formdataId) {
String serviceAuthorisation = securityUtils.getServiceAuthorisation();
String authorisation = securityUtils.getAuthorisation();
submitServiceApi.saveCase(authorisation, serviceAuthorisation,
ProbateCaseDetails resultProbateCaseDetails = submitServiceApi.saveCase(authorisation, serviceAuthorisation,
formdataId, "event update case data", probateCaseDetails);
return resultProbateCaseDetails.getCaseInfo().getLastModifiedDateTime();
}

private void updateCaseDataAsCaseWorker(ProbateCaseDetails probateCaseDetails, String formdataId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import uk.gov.hmcts.reform.probate.model.PaymentStatus;
import uk.gov.hmcts.reform.probate.model.ProbateType;
import uk.gov.hmcts.reform.probate.model.cases.CaseData;
import uk.gov.hmcts.reform.probate.model.cases.CaseInfo;
import uk.gov.hmcts.reform.probate.model.cases.CasePayment;
import uk.gov.hmcts.reform.probate.model.cases.CaseType;
import uk.gov.hmcts.reform.probate.model.cases.CollectionMember;
Expand All @@ -30,6 +31,7 @@
import uk.gov.hmcts.reform.probate.model.forms.pa.PaForm;
import uk.gov.hmcts.reform.probate.model.payments.PaymentDto;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -149,16 +151,19 @@ private Form initiateForm(ProbateType probateType) {


@Override
public Form saveCase(String identifier, Form form) {
log.info("Save case called");
public Form saveCase(String identifier, LocalDateTime lastModifiedDateTime, Form form) {
log.info("Save case called lastModifiedDateTime {} :", lastModifiedDateTime);
assertIdentifier(identifier, form);
FormMapper formMapper = mappers.get(form.getType());
CaseInfo caseInfo = new CaseInfo();
caseInfo.setLastModifiedDateTime(lastModifiedDateTime);
log.info("Save case called submitServiceApi.saveCase");
ProbateCaseDetails probateCaseDetails = submitServiceApi.saveCase(
securityUtils.getAuthorisation(),
securityUtils.getServiceAuthorisation(),
identifier,
form.getEventDescription(),
ProbateCaseDetails.builder().caseData(mapToCase(form, formMapper)).build()
ProbateCaseDetails.builder().caseData(mapToCase(form, formMapper)).caseInfo(caseInfo).build()
);
return mapFromCase(formMapper, probateCaseDetails);
}
Expand Down Expand Up @@ -223,6 +228,7 @@ private void updateCcdCase(ProbateCaseDetails probateCaseDetails, Form formRespo
.id(Long.valueOf(probateCaseDetails.getCaseInfo().getCaseId()))
.state(probateCaseDetails.getCaseInfo().getState().getName())
.lastModifiedDate(probateCaseDetails.getCaseInfo().getLastModifiedDate())
.lastModifiedDateTime(probateCaseDetails.getCaseInfo().getLastModifiedDateTime())
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import uk.gov.hmcts.reform.probate.model.documents.CheckAnswersSummary;
import uk.gov.hmcts.reform.probate.model.documents.LegalDeclaration;
import uk.gov.hmcts.reform.probate.model.multiapplicant.Invitation;
import uk.gov.hmcts.reform.probate.model.multiapplicant.InvitationsResult;

import java.util.List;

Expand Down Expand Up @@ -36,7 +37,7 @@ public interface BusinessService {

String getPinNumber(PhonePin phonePin, String sessionId, Boolean isBilingual);

List<Invitation> sendInvitations(List<Invitation> invitations, String sessionId, Boolean isBilingual);
InvitationsResult sendInvitations(List<Invitation> invitations, String sessionId, Boolean isBilingual);

void documentUploadNotification(String formDataId, String citizenResponseCheckbox);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import uk.gov.hmcts.reform.probate.model.forms.Form;
import uk.gov.hmcts.reform.probate.model.payments.PaymentDto;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

Expand All @@ -20,7 +21,7 @@ public interface SubmitService {

CaseSummaryHolder getAllCases();

Form saveCase(String identifier, Form form);
Form saveCase(String identifier, LocalDateTime lastModifiedDateTime, Form form);

Form submit(String identifier, Form form);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import uk.gov.hmcts.reform.probate.model.documents.LegalDeclaration;
import uk.gov.hmcts.reform.probate.model.multiapplicant.ExecutorNotification;
import uk.gov.hmcts.reform.probate.model.multiapplicant.Invitation;
import uk.gov.hmcts.reform.probate.model.multiapplicant.InvitationsResult;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
Expand Down Expand Up @@ -109,6 +110,10 @@ public void setUp() throws Exception {
.thenReturn(ExecutorApplying.builder().applyingExecutorName("Test Executor").build());
when(mockGrantOfRepresentationData.getPrimaryApplicantEmailAddress()).thenReturn(emailaddress);

when(submitServiceApi.saveCase(AUTHORIZATION, SERVICE_AUTHORIZATION,
formdataId, "event update case data", mockProbateCaseDetails))
.thenReturn(mockProbateCaseDetails);

pdfExample = new byte[10];
businessService = new BusinessServiceImpl(businessServiceApi,
submitServiceApi, securityUtils, mockExecutorApplyingToInvitationMapper);
Expand Down Expand Up @@ -203,7 +208,7 @@ public void shouldSendInvitationsAndUpdateProbateCaseDetails() {
when(businessServiceApi.invite(resendInvitation.getInviteId(), resendInvitation, sessionId))
.thenReturn(resendInvitation.getInviteId());

List<Invitation> results = businessService
InvitationsResult results = businessService
.sendInvitations(Lists.newArrayList(newInvitation, resendInvitation), sessionId, Boolean.FALSE);

verify(businessServiceApi).invite(newInvitation, sessionId);
Expand Down Expand Up @@ -232,7 +237,7 @@ public void shouldSendBilingualInvitationsAndUpdateProbateCaseDetails() {
when(businessServiceApi.inviteBilingual(resendInvitation.getInviteId(), resendInvitation, sessionId))
.thenReturn(resendInvitation.getInviteId());

List<Invitation> results = businessService
InvitationsResult results = businessService
.sendInvitations(Lists.newArrayList(newInvitation, resendInvitation), sessionId, Boolean.TRUE);

verify(businessServiceApi).inviteBilingual(newInvitation, sessionId);
Expand Down Expand Up @@ -268,6 +273,7 @@ public void shouldDetermineIfAllInviteesHaveAgreedFromCase() {
public void shouldUpdateContactDetailsOnCase() {

businessService.updateContactDetails(formdataId, getInvitation(formdataId));

verifyGetCaseCalls();
verify(mockGrantOfRepresentationData)
.updateInvitationContactDetailsForExecutorApplying(invitationId, emailaddress, phoneNumber);
Expand Down
Loading