Skip to content

Commit

Permalink
CIV-15986 Implement history for GA back button (#5458)
Browse files Browse the repository at this point in the history
* refactor back button

* refactor back button

* remove page guards.

* remove page guards

* CIV-15986 Implement guard functionality in ga service

* CIV-15986 Skip add another if vary payment terms of judgment

* CIV-15986 Use single quotes

* CIV-15986 Fix test for back link

* CIV-15986 Delete unused guards

* CIV-15986 Do not duplicate file upload pages in history

* CIV-15986 Replace regex with split (fix sonar issue)

* CIV-15986 Revert unintended change

* CIV-15986 Implement back history for GA response

* CIV-15986 Implement for upload docs journeys

* CIV-15986 Implement for remaining upload docs journeys

* CIV-15986 Add dashboard page to history list

---------

Co-authored-by: LeonardoPalmeiro <[email protected]>
Co-authored-by: jors95-moj <[email protected]>
Co-authored-by: sankhajuria <[email protected]>
  • Loading branch information
4 people authored Feb 7, 2025
1 parent 883587b commit f2052f8
Show file tree
Hide file tree
Showing 56 changed files with 330 additions and 763 deletions.
115 changes: 110 additions & 5 deletions src/main/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,72 @@ import {setLanguage} from 'modules/i18n/languageService';
import {isServiceShuttered, updateE2EKey} from './app/auth/launchdarkly/launchDarklyClient';
import {getRedisStoreForSession} from 'modules/utilityService';
import {
APPLICATION_TYPE_URL,
ASSIGN_FRC_BAND_URL,
BASE_CASE_PROGRESSION_URL,
BASE_CLAIM_URL,
BASE_CLAIMANT_RESPONSE_URL,
BASE_GENERAL_APPLICATION_RESPONSE_URL,
BASE_GENERAL_APPLICATION_URL, CLAIMANT_RESPONSE_CHECK_ANSWERS_URL,
BASE_GENERAL_APPLICATION_URL,
CLAIMANT_RESPONSE_CHECK_ANSWERS_URL,
CP_FINALISE_TRIAL_ARRANGEMENTS_CONFIRMATION_URL,
CP_FINALISE_TRIAL_ARRANGEMENTS_URL,
CP_FINALISE_TRIAL_ARRANGEMENTS_URL, DASHBOARD_CLAIMANT_URL, DEFENDANT_SUMMARY_URL,
DQ_DISCLOSURE_OF_DOCUMENTS_URL,
DQ_MULTITRACK_AGREEMENT_REACHED_URL,
DQ_MULTITRACK_CLAIMANT_DOCUMENTS_TO_BE_CONSIDERED_DETAILS_URL,
DQ_MULTITRACK_CLAIMANT_DOCUMENTS_TO_BE_CONSIDERED_URL,
DQ_MULTITRACK_DISCLOSURE_NON_ELECTRONIC_DOCUMENTS_URL,
DQ_MULTITRACK_DISCLOSURE_OF_ELECTRONIC_DOCUMENTS_ISSUES_URL,
DQ_REQUEST_EXTRA_4WEEKS_URL, FRC_BAND_AGREED_URL,
DQ_REQUEST_EXTRA_4WEEKS_URL,
FRC_BAND_AGREED_URL,
GA_ADD_ANOTHER_APPLICATION_URL,
GA_AGREE_TO_ORDER_URL,
GA_AGREEMENT_FROM_OTHER_PARTY_URL,
GA_APPLICATION_COSTS_URL,
GA_CHECK_ANSWERS_URL,
GA_CLAIM_APPLICATION_COST_URL,
GA_HEARING_ARRANGEMENT_URL,
GA_HEARING_ARRANGEMENTS_GUIDANCE_URL,
GA_HEARING_CONTACT_DETAILS_URL,
GA_HEARING_SUPPORT_URL,
GA_PROVIDE_MORE_INFORMATION_URL,
GA_REQUESTING_REASON_URL,
GA_RESPOND_ADDITIONAL_INFO_URL,
GA_RESPONDENT_AGREEMENT_URL,
GA_RESPONDENT_HEARING_PREFERENCE_URL,
GA_RESPONDENT_UPLOAD_DOCUMENT_URL,
GA_RESPONDENT_WANT_TO_UPLOAD_DOCUMENT_URL,
GA_RESPONSE_CHECK_ANSWERS_URL,
GA_RESPONSE_HEARING_ARRANGEMENT_URL,
GA_RESPONSE_HEARING_CONTACT_DETAILS_URL,
GA_RESPONSE_HEARING_SUPPORT_URL,
GA_RESPONSE_UNAVAILABLE_HEARING_DATES_URL,
GA_RESPONSE_VIEW_APPLICATION_URL, GA_UNAVAILABILITY_CONFIRMATION_URL,
GA_UNAVAILABILITY_RESPONSE_CONFIRMATION_URL,
GA_UNAVAILABLE_HEARING_DATES_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL,
GA_UPLOAD_DOCUMENT_DIRECTIONS_ORDER_CYA_URL,
GA_UPLOAD_DOCUMENT_DIRECTIONS_ORDER_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL,
GA_UPLOAD_DOCUMENTS_URL,
GA_UPLOAD_N245_FORM_URL,
GA_UPLOAD_WRITTEN_REPRESENTATION_DOCS_CYA_URL,
GA_UPLOAD_WRITTEN_REPRESENTATION_DOCS_URL,
GA_VIEW_APPLICATION_URL,
GA_WANT_TO_UPLOAD_DOCUMENTS_URL,
HAS_ANYTHING_CHANGED_URL,
IS_CASE_READY_URL, REASON_FOR_FRC_BAND_URL, RESPONSE_CHECK_ANSWERS_URL,
INFORM_OTHER_PARTIES_URL,
IS_CASE_READY_URL,
ORDER_JUDGE_URL,
PAYING_FOR_APPLICATION_URL,
REASON_FOR_FRC_BAND_URL,
RESPONSE_CHECK_ANSWERS_URL,
SIGN_OUT_URL,
STATEMENT_OF_MEANS_URL, SUBJECT_TO_FRC_URL, TEST_SUPPORT_TOGGLE_FLAG_ENDPOINT,
STATEMENT_OF_MEANS_URL,
SUBJECT_TO_FRC_URL,
TEST_SUPPORT_TOGGLE_FLAG_ENDPOINT,
TRIAL_ARRANGEMENTS_HEARING_DURATION,
} from 'routes/urls';
import {statementOfMeansGuard} from 'routes/guards/statementOfMeansGuard';
Expand All @@ -52,6 +99,7 @@ import {OidcMiddleware} from 'modules/oidc';
import {AppSession} from 'models/AppRequest';
import {DraftStoreCliente2e, getRedisStoreForSessione2e} from 'modules/e2eConfiguration';
import { deleteGAGuard } from 'routes/guards/deleteGAGuard';
import {GaTrackHistory} from 'routes/guards/GaTrackHistory';

const {Logger} = require('@hmcts/nodejs-logging');
const {setupDev} = require('./development');
Expand Down Expand Up @@ -157,6 +205,63 @@ app.use([DQ_REQUEST_EXTRA_4WEEKS_URL,
RESPONSE_CHECK_ANSWERS_URL,
CLAIMANT_RESPONSE_CHECK_ANSWERS_URL], trackHistory);

app.use([
//GA
DASHBOARD_CLAIMANT_URL,
DEFENDANT_SUMMARY_URL,
GA_VIEW_APPLICATION_URL,
APPLICATION_TYPE_URL,
GA_AGREEMENT_FROM_OTHER_PARTY_URL,
INFORM_OTHER_PARTIES_URL,
GA_CLAIM_APPLICATION_COST_URL,
GA_APPLICATION_COSTS_URL,
GA_CLAIM_APPLICATION_COST_URL,
GA_UPLOAD_N245_FORM_URL,
GA_WANT_TO_UPLOAD_DOCUMENTS_URL,
GA_UPLOAD_DOCUMENTS_URL,
GA_HEARING_ARRANGEMENTS_GUIDANCE_URL,
GA_HEARING_ARRANGEMENT_URL,
GA_HEARING_CONTACT_DETAILS_URL,
GA_UNAVAILABILITY_CONFIRMATION_URL,
GA_UNAVAILABLE_HEARING_DATES_URL,
GA_HEARING_SUPPORT_URL,
PAYING_FOR_APPLICATION_URL,
GA_CHECK_ANSWERS_URL,
ORDER_JUDGE_URL,
GA_REQUESTING_REASON_URL,
GA_ADD_ANOTHER_APPLICATION_URL,
], GaTrackHistory);

app.use([
//GA response
GA_RESPONSE_VIEW_APPLICATION_URL,
GA_AGREE_TO_ORDER_URL,
GA_RESPONDENT_AGREEMENT_URL,
GA_RESPONSE_HEARING_ARRANGEMENT_URL,
GA_RESPONSE_HEARING_CONTACT_DETAILS_URL,
GA_RESPONSE_HEARING_SUPPORT_URL,
GA_RESPONDENT_HEARING_PREFERENCE_URL,
GA_RESPONDENT_UPLOAD_DOCUMENT_URL,
GA_RESPONDENT_WANT_TO_UPLOAD_DOCUMENT_URL,
GA_UNAVAILABILITY_RESPONSE_CONFIRMATION_URL,
GA_RESPONSE_UNAVAILABLE_HEARING_DATES_URL,
GA_RESPONSE_CHECK_ANSWERS_URL,
], GaTrackHistory);

app.use([
//GA upload documents
GA_RESPOND_ADDITIONAL_INFO_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL,
GA_PROVIDE_MORE_INFORMATION_URL,
GA_UPLOAD_WRITTEN_REPRESENTATION_DOCS_URL,
GA_UPLOAD_WRITTEN_REPRESENTATION_DOCS_CYA_URL,
GA_UPLOAD_DOCUMENT_DIRECTIONS_ORDER_URL,
GA_UPLOAD_DOCUMENT_DIRECTIONS_ORDER_CYA_URL,
], GaTrackHistory);

app.use(bodyParser.json({limit: '500mb'}));
app.use(bodyParser.urlencoded({ limit: '500mb', extended: true }));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import {NextFunction, Response, Router} from 'express';
import {AppRequest} from 'common/models/AppRequest';
import {
APPLICATION_TYPE_URL,
APPLICATION_TYPE_URL, BACK_URL,
GA_ADD_ANOTHER_APPLICATION_URL,
GA_REQUESTING_REASON_URL,
GA_WANT_TO_UPLOAD_DOCUMENTS_URL,
} from 'routes/urls';
import {getClaimById} from 'modules/utilityService';
Expand All @@ -21,7 +20,6 @@ import {GenericYesNo} from 'common/form/models/genericYesNo';
import {generateRedisKey, saveDraftClaim} from 'modules/draft-store/draftStoreService';
import {YesNo} from 'form/models/yesNo';
import {constructResponseUrlWithIdParams, constructUrlWithIndex} from 'common/utils/urlFormatter';
import {addAnotherApplicationGuard} from 'routes/guards/generalApplication/addAnotherApplicationGuard';
import {queryParamNumber} from 'common/utils/requestUtils';

const addAnotherApplicationController = Router();
Expand All @@ -32,7 +30,7 @@ const renderView = async (req: AppRequest, res: Response, form?: GenericForm<Gen
const redisKey = generateRedisKey(req);
const claim = await getClaimById(redisKey, req, true);
const applicationIndex = queryParamNumber(req, 'index') || claim.generalApplication.applicationTypes.length - 1;
const backLinkUrl = getBackLinkUrl(claimId, applicationIndex);
const backLinkUrl = BACK_URL;
const cancelUrl = await getCancelUrl(claimId, claim);
const applicationTypeOption = getByIndexOrLast(claim.generalApplication?.applicationTypes, applicationIndex)?.option;
const applicationType = getApplicationTypeOptionByTypeAndDescription(applicationTypeOption, ApplicationTypeOptionSelection.BY_APPLICATION_TYPE);
Expand All @@ -48,13 +46,13 @@ const renderView = async (req: AppRequest, res: Response, form?: GenericForm<Gen
res.render(viewPath, { form, cancelUrl, backLinkUrl, applicationType });
};

addAnotherApplicationController.get(GA_ADD_ANOTHER_APPLICATION_URL, addAnotherApplicationGuard, async (req: AppRequest, res: Response, next: NextFunction) => {
addAnotherApplicationController.get(GA_ADD_ANOTHER_APPLICATION_URL, async (req: AppRequest, res: Response, next: NextFunction) => {
renderView(req, res).catch((error) => {
next(error);
});
});

addAnotherApplicationController.post(GA_ADD_ANOTHER_APPLICATION_URL, addAnotherApplicationGuard, async (req: AppRequest, res: Response, next: NextFunction) => {
addAnotherApplicationController.post(GA_ADD_ANOTHER_APPLICATION_URL, async (req: AppRequest, res: Response, next: NextFunction) => {
try {
const form = new GenericForm(new GenericYesNo(req.body.option, 'ERRORS.GENERAL_APPLICATION.WANT_TO_ADD_ANOTHER_APPLICATION'));
await form.validate();
Expand All @@ -71,7 +69,6 @@ addAnotherApplicationController.post(GA_ADD_ANOTHER_APPLICATION_URL, addAnotherA
res.redirect(constructResponseUrlWithIdParams(claimId, APPLICATION_TYPE_URL) + '?linkFrom=' + LinKFromValues.addAnotherApp);
} else {
let index = queryParamNumber(req, 'index') || claim.generalApplication.applicationTypes.length - 1;
//todo add if with changeScreen
if (req.query['changeScreen'] === 'true'){
await removeAllOtherApplications(redisKey, claim);
index = claim.generalApplication.applicationTypes.length - 1;
Expand All @@ -87,9 +84,4 @@ addAnotherApplicationController.post(GA_ADD_ANOTHER_APPLICATION_URL, addAnotherA
}
});

function getBackLinkUrl(claimId: string, index: number) : string {
const indexParam = `?index=${index}`;
return constructResponseUrlWithIdParams(claimId, GA_REQUESTING_REASON_URL) + indexParam;
}

export default addAnotherApplicationController;
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { ApplicationEvent } from 'common/models/gaEvents/applicationEvent';
import { AppRequest } from 'common/models/AppRequest';
import { buildSummarySectionForAdditionalDoc, getClaimDetailsById, prepareCCDData } from 'services/features/generalApplication/additionalDocumentService';
import { caseNumberPrettify } from 'common/utils/stringUtils';
import { GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL, GA_UPLOAD_ADDITIONAL_DOCUMENTS_SUBMITTED_URL, GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL } from 'routes/urls';
import {
BACK_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_SUBMITTED_URL,
} from 'routes/urls';
import { GaServiceClient } from 'client/gaServiceClient';
import { getCancelUrl } from 'services/features/generalApplication/generalApplicationService';
import { NextFunction, RequestHandler, Response, Router } from 'express';
Expand All @@ -21,7 +25,7 @@ gaAdditionalDocCheckAnswerController.get(GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL,
const claimIdPrettified = caseNumberPrettify(claimId);
const claim = await getClaimDetailsById(req);
const cancelUrl = await getCancelUrl(claimId, claim);
const backLinkUrl = constructResponseUrlWithIdAndAppIdParams(claimId, appId, GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL);
const backLinkUrl = BACK_URL;
const summaryRows = buildSummarySectionForAdditionalDoc(claim.generalApplication.uploadAdditionalDocuments, claimId, appId, lng);
res.render(viewPath, { backLinkUrl, cancelUrl, claimIdPrettified, claim, summaryRows });
} catch (error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { GenericForm } from 'common/form/models/genericForm';
import { AppRequest } from 'common/models/AppRequest';
import { NextFunction, RequestHandler, Response, Router } from 'express';
import { GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL, GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL, GA_VIEW_APPLICATION_URL } from 'routes/urls';
import {
BACK_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_CYA_URL,
GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL,
} from 'routes/urls';
import multer from 'multer';
import { UploadAdditionalDocument } from 'common/models/generalApplication/UploadAdditionalDocument';
import { generateRedisKey } from 'modules/draft-store/draftStoreService';
import { constructResponseUrlWithIdAndAppIdParams } from 'common/utils/urlFormatter';
import {getApplicationIndex, getCancelUrl} from 'services/features/generalApplication/generalApplicationService';
import { getCancelUrl } from 'services/features/generalApplication/generalApplicationService';
import { getClaimDetailsById, getSummaryList, removeSelectedDocument, uploadSelectedFile } from 'services/features/generalApplication/additionalDocumentService';

const uploadAdditionalDocumentsController = Router();
Expand Down Expand Up @@ -39,8 +43,7 @@ uploadAdditionalDocumentsController.get(GA_UPLOAD_ADDITIONAL_DOCUMENTS_URL, (asy
await removeSelectedDocument(redisKey, claim, Number(index) - 1);
}
const cancelUrl = await getCancelUrl(id, claim);
const index = await getApplicationIndex(id, gaId, req);
const backLinkUrl = `${constructResponseUrlWithIdAndAppIdParams(id, gaId, GA_VIEW_APPLICATION_URL)}?index=${index + 1}`;
const backLinkUrl = BACK_URL;
const formattedSummary = getSummaryList(gaDetails.uploadAdditionalDocuments, id, gaId, lng);
res.render(viewPath, { cancelUrl, backLinkUrl, form, formattedSummary });
} catch (err) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {NextFunction, RequestHandler, Response, Router} from 'express';
import {
GA_RESPOND_ADDITIONAL_INFO_URL,
BACK_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CONFIRMATION_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL, GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL,
} from 'routes/urls';
import {AppRequest} from 'models/AppRequest';
import {
Expand Down Expand Up @@ -37,15 +37,8 @@ gaRequestMoreInfoCheckAnswersController.get(GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_IN
const cancelUrl = await getCancelUrl(claimId, claim);
const additionalDocuments = await getGADocumentsFromDraftStore(generateRedisKeyForGA(req));
const gaResponse = await getDraftGARespondentResponse(generateRedisKeyForGA(req));
const backLinkUrlDoc = constructResponseUrlWithIdAndAppIdParams(claimId, appId, GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL);
const additionalText = gaResponse.additionalText;
const backLinkUrlText = constructResponseUrlWithIdAndAppIdParams(claimId, appId, GA_RESPOND_ADDITIONAL_INFO_URL);
let backLinkUrl;
if (additionalDocuments.length < 1) {
backLinkUrl = backLinkUrlText;
} else {
backLinkUrl = backLinkUrlDoc;
}
const backLinkUrl = BACK_URL;
const summaryRows = buildSummarySection(additionalText, additionalDocuments, claimId, appId, lng);
res.render(viewPath, { backLinkUrl, cancelUrl, claimIdPrettified, claim, summaryRows, headerCaption });
} catch (error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import {NextFunction, RequestHandler, Response, Router} from 'express';
import {
BACK_URL,
GA_MAKE_WITH_NOTICE_DOCUMENT_VIEW_URL,
GA_RESPOND_ADDITIONAL_INFO_URL, GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL,
GA_VIEW_APPLICATION_URL,
} from 'routes/urls';
import {AppRequest} from 'models/AppRequest';
import {caseNumberPrettify, documentIdExtractor} from 'common/utils/stringUtils';
Expand Down Expand Up @@ -39,7 +39,7 @@ respondAddInfoController.get(GA_RESPOND_ADDITIONAL_INFO_URL, (async (req: AppReq
const claim = await getClaimById(claimId, req, true);
const gaResponse = await getDraftGARespondentResponse(generateRedisKeyForGA(req));
const cancelUrl = await getCancelUrl(claimId, claim);
const backLinkUrl = constructResponseUrlWithIdAndAppIdParams(claimId, appId, GA_VIEW_APPLICATION_URL).concat('?index=1');
const backLinkUrl = BACK_URL;
const additionalText = gaResponse.additionalText;
const wantToUploadAddlDocuments = gaResponse.wantToUploadAddlDocuments;
const respondAddInfo = new RespondAddInfo(wantToUploadAddlDocuments, additionalText);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {NextFunction, RequestHandler, Response, Router} from 'express';
import {
GA_RESPOND_ADDITIONAL_INFO_URL,
BACK_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_CYA_URL,
GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL,
} from 'routes/urls';
Expand Down Expand Up @@ -33,7 +33,7 @@ const upload = multer({
async function renderView(form: GenericForm<UploadGAFiles>, claim: Claim, claimId: string, gaId: string, res: Response, formattedSummary: SummarySection): Promise<void> {
const cancelUrl = await getCancelUrl(claimId, claim);
const currentUrl = constructResponseUrlWithIdAndAppIdParams(claimId, gaId, GA_UPLOAD_DOCUMENT_FOR_ADDITIONAL_INFO_URL);
const backLinkUrl = constructResponseUrlWithIdAndAppIdParams(claimId, gaId, GA_RESPOND_ADDITIONAL_INFO_URL);
const backLinkUrl = BACK_URL;
res.render(viewPath, {
form,
formattedSummary,
Expand Down
Loading

0 comments on commit f2052f8

Please sign in to comment.