Skip to content

Commit 802fd75

Browse files
authored
Merge pull request #1752 from companieshouse/feat/cc-3018/get-and-save-app-data-using-DB-for-secure-update-filter-page
feat/cc-3018: save and retrieve application data from the DB for the `secure-update-filter` page
2 parents 0427c80 + b3fa80c commit 802fd75

File tree

6 files changed

+183
-62
lines changed

6 files changed

+183
-62
lines changed

src/controllers/update/secure.update.filter.controller.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ import { NextFunction, Request, Response } from "express";
22

33
import * as config from "../../config";
44
import { getFilterPage, postFilterPage } from "../../utils/secure.filter";
5+
import { isActiveFeature } from "../../utils/feature.flag";
56

67
export const get = async (req: Request, res: Response, next: NextFunction) => {
7-
await getFilterPage(req, res, next, config.SECURE_UPDATE_FILTER_PAGE, config.UPDATE_LANDING_PAGE_URL);
8+
await getFilterPage(req, res, next, config.SECURE_UPDATE_FILTER_PAGE, config.UPDATE_CONTINUE_WITH_SAVED_FILING_URL);
89
};
910

10-
export const post = (req: Request, res: Response, next: NextFunction) => {
11-
postFilterPage(req, res, next, config.UPDATE_USE_PAPER_URL, config.UPDATE_INTERRUPT_CARD_URL);
11+
export const post = async (req: Request, res: Response, next: NextFunction) => {
12+
const nextPageUrl = isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL)
13+
? config.UPDATE_INTERRUPT_CARD_WITH_PARAMS_URL : config.UPDATE_INTERRUPT_CARD_URL;
14+
await postFilterPage(req, res, next, config.UPDATE_USE_PAPER_URL, nextPageUrl);
1215
};

src/controllers/update/update.interrupt.card.controller.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { NextFunction, Request, Response } from "express";
2-
32
import { logger } from "../../utils/logger";
43
import * as config from "../../config";
5-
import { isRemoveJourney } from "../../utils/url";
4+
import { isActiveFeature } from "../../utils/feature.flag";
5+
import {
6+
isRemoveJourney,
7+
getUrlWithTransactionIdAndSubmissionId,
8+
getTransactionIdAndSubmissionIdFromOriginalUrl,
9+
} from "../../utils/url";
610

711
export const get = async (req: Request, res: Response, next: NextFunction) => {
12+
813
try {
14+
915
logger.debugRequest(req, `${req.method} ${req.route.path}`);
1016
const isRemove: boolean = await isRemoveJourney(req);
1117

@@ -18,7 +24,7 @@ export const get = async (req: Request, res: Response, next: NextFunction) => {
1824
}
1925

2026
return res.render(config.UPDATE_INTERRUPT_CARD_PAGE, {
21-
backLinkUrl: config.SECURE_UPDATE_FILTER_URL,
27+
backLinkUrl: getBackLinkUrl(req),
2228
templateName: config.UPDATE_INTERRUPT_CARD_PAGE,
2329
});
2430
} catch (error) {
@@ -28,7 +34,9 @@ export const get = async (req: Request, res: Response, next: NextFunction) => {
2834
};
2935

3036
export const post = async (req: Request, res: Response, next: NextFunction) => {
37+
3138
try {
39+
3240
logger.debugRequest(req, `${req.method} ${req.route.path}`);
3341
const isRemove: boolean = await isRemoveJourney(req);
3442

@@ -41,3 +49,23 @@ export const post = async (req: Request, res: Response, next: NextFunction) => {
4149
next(error);
4250
}
4351
};
52+
53+
const getBackLinkUrl = (req: Request) => {
54+
55+
try {
56+
57+
const ids = getTransactionIdAndSubmissionIdFromOriginalUrl(req);
58+
59+
if (!isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL) || (typeof ids === "undefined")) {
60+
return config.SECURE_UPDATE_FILTER_URL;
61+
}
62+
return getUrlWithTransactionIdAndSubmissionId(
63+
config.SECURE_UPDATE_FILTER_WITH_PARAMS_URL,
64+
ids[config.ROUTE_PARAM_TRANSACTION_ID],
65+
ids[config.ROUTE_PARAM_SUBMISSION_ID]
66+
);
67+
} catch (error) {
68+
logger.errorRequest(req, error);
69+
return config.SECURE_UPDATE_FILTER_URL;
70+
}
71+
};

src/controllers/update/update.use.paper.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export const get = async (req: Request, res: Response) => {
99
let applyWithPaperFormHeading: string = "You'll need to file an update using the paper form";
1010
const isRemove: boolean = await isRemoveJourney(req);
1111

12-
if (isRemove){
12+
if (isRemove) {
1313
applyWithPaperFormHeading = "You'll need to submit this filing using the paper form";
1414
return res.render(config.USE_PAPER_PAGE, {
1515
journey: config.JourneyType.remove,

src/utils/secure.filter.ts

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
import { NextFunction, Request, Response } from "express";
22
import { ApplicationData } from "../model";
3-
import { IsSecureRegisterKey, OverseasEntityKey, Transactionkey } from "../model/data.types.model";
4-
import { fetchApplicationData, setExtraData } from "./application.data";
53
import { logger } from "./logger";
6-
import { getUrlWithTransactionIdAndSubmissionId, isRemoveJourney, isRegistrationJourney } from "../utils/url";
74
import * as config from "../config";
85
import { isActiveFeature } from "./feature.flag";
9-
import { updateOverseasEntity } from "../service/overseas.entities.service";
6+
107
import { Session } from "@companieshouse/node-session-handler";
8+
import { postTransaction } from "../service/transaction.service";
9+
10+
import { IsSecureRegisterKey, OverseasEntityKey, Transactionkey } from "../model/data.types.model";
11+
import { getApplicationData, setExtraData } from "./application.data";
12+
import { createOverseasEntity, updateOverseasEntity } from "../service/overseas.entities.service";
13+
14+
import {
15+
getUrlWithTransactionIdAndSubmissionId,
16+
isRemoveJourney,
17+
isUpdateJourney
18+
} from "../utils/url";
1119

1220
export const getFilterPage = async (req: Request, res: Response, next: NextFunction, templateName: string, backLinkUrl: string): Promise<void> => {
1321

1422
try {
1523

1624
logger.debugRequest(req, `${req.method} ${req.route.path}`);
1725

18-
const isRegistration = isRegistrationJourney(req);
1926
const isRemove = await isRemoveJourney(req);
20-
const appData: ApplicationData = await fetchApplicationData(req, isRegistration);
27+
const appData: ApplicationData = await getApplicationData(req, true);
2128

2229
if (isRemove) {
2330
return res.render(templateName, {
@@ -52,32 +59,24 @@ export const postFilterPage = async (
5259

5360
logger.debugRequest(req, `${req.method} ${req.route.path}`);
5461

55-
const isRegistration: boolean = isRegistrationJourney(req);
62+
const isRedisRemovalFlag = isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL);
63+
const isUpdate: boolean = await isUpdateJourney(req);
5664
const isRemove: boolean = await isRemoveJourney(req);
57-
const appData: ApplicationData = await fetchApplicationData(req, isRegistration);
58-
65+
const appData: ApplicationData = await getApplicationData(req, true);
5966
const isSecureRegister = (req.body[IsSecureRegisterKey]).toString();
6067
appData[IsSecureRegisterKey] = isSecureRegister;
61-
const session = req.session as Session;
6268

6369
let nextPageUrl: string = "";
6470

6571
if (isSecureRegister === "1") {
6672
nextPageUrl = isSecureRegisterYesUrl;
67-
if (isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL) && isRegistration) {
68-
nextPageUrl = getUrlWithTransactionIdAndSubmissionId(isSecureRegisterYesUrl, appData[Transactionkey] as string, appData[OverseasEntityKey] as string);
69-
}
7073
}
7174

7275
if (isSecureRegister === "0") {
7376
nextPageUrl = isSecureRegisterNoUrl;
74-
if (isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL) && isRegistration) {
75-
if (appData[Transactionkey] && appData[OverseasEntityKey]) {
76-
await updateOverseasEntity(req, session, appData);
77-
} else {
78-
throw new Error("Error: is_secure_register filter cannot be updated - transaction_id or overseas_entity_id is missing");
79-
}
80-
nextPageUrl = getUrlWithTransactionIdAndSubmissionId(isSecureRegisterNoUrl, appData[Transactionkey] as string, appData[OverseasEntityKey] as string);
77+
if (isRedisRemovalFlag && !isRemove) {
78+
await createOrUpdateEntityDetails(req, appData, isUpdate);
79+
nextPageUrl = getNextPageUrl(appData, isSecureRegisterNoUrl, isRemove, isRedisRemovalFlag);
8180
}
8281
}
8382

@@ -93,3 +92,32 @@ export const postFilterPage = async (
9392
next(error);
9493
}
9594
};
95+
96+
const createOrUpdateEntityDetails = async (req: Request, appData: ApplicationData, isUpdate: boolean): Promise<void> => {
97+
98+
const session = req.session as Session;
99+
100+
if (isUpdate && !appData[Transactionkey]) {
101+
const transactionID = await postTransaction(req, session);
102+
appData[Transactionkey] = transactionID;
103+
appData[OverseasEntityKey] = await createOverseasEntity(req, session, transactionID);
104+
}
105+
106+
if (appData[Transactionkey] && appData[OverseasEntityKey]) {
107+
await updateOverseasEntity(req, session, appData);
108+
} else {
109+
throw new Error("Error: is_secure_register filter cannot be updated - transaction_id or overseas_entity_id is missing");
110+
}
111+
};
112+
113+
const getNextPageUrl = (appData: ApplicationData, fallbackUrl: string, isRemove: boolean, isRedisRemovalFlag: boolean): string => {
114+
try {
115+
if (isRedisRemovalFlag && !isRemove) {
116+
return getUrlWithTransactionIdAndSubmissionId(fallbackUrl, appData[Transactionkey] as string, appData[OverseasEntityKey] as string);
117+
}
118+
return fallbackUrl;
119+
} catch (error) {
120+
logger.error(`Error generating nextPageUrl with transactionId and submissionId: ${error}`);
121+
return fallbackUrl;
122+
}
123+
};

test/controllers/secure.register.filter.controller.spec.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ describe( "SECURE REGISTER FILTER controller", () => {
9696
describe("GET tests", () => {
9797

9898
test(`renders the ${config.SECURE_REGISTER_FILTER_PAGE} page`, async () => {
99-
mockFetchApplicationData.mockReturnValueOnce({});
99+
mockGetApplicationData.mockReturnValueOnce({});
100100
const resp = await request(app).get(SECURE_REGISTER_FILTER_URL);
101101

102102
expect(resp.status).toEqual(200);
@@ -113,7 +113,7 @@ describe( "SECURE REGISTER FILTER controller", () => {
113113
test(`renders the ${config.SECURE_REGISTER_FILTER_PAGE} page and REDIS_removal flag is set to OFF`, async () => {
114114
mockIsActiveFeature.mockReturnValueOnce(false);
115115
mockGetUrlWithParamsToPath.mockReturnValueOnce('/some-url');
116-
mockFetchApplicationData.mockReturnValueOnce({});
116+
mockGetApplicationData.mockReturnValueOnce({});
117117
mockIsRemoveJourney.mockReturnValue(false);
118118
const resp = await request(app).get(SECURE_REGISTER_FILTER_URL);
119119

@@ -132,9 +132,9 @@ describe( "SECURE REGISTER FILTER controller", () => {
132132
});
133133

134134
test(`renders the ${config.SECURE_REGISTER_FILTER_PAGE} page and REDIS_removal flag is set to ON`, async () => {
135-
mockIsActiveFeature.mockReturnValueOnce(true);
135+
mockIsActiveFeature.mockReturnValue(true);
136136
mockGetUrlWithParamsToPath.mockReturnValueOnce('/some-url');
137-
mockFetchApplicationData.mockReturnValueOnce({});
137+
mockGetApplicationData.mockReturnValueOnce({});
138138
mockIsRemoveJourney.mockReturnValue(false);
139139
const resp = await request(app).get(SECURE_REGISTER_FILTER_WITH_PARAMS_URL);
140140

@@ -162,7 +162,7 @@ describe( "SECURE REGISTER FILTER controller", () => {
162162
});
163163

164164
test(`renders the ${config.SECURE_REGISTER_FILTER_PAGE} page with radios selected to yes`, async () => {
165-
mockFetchApplicationData.mockReturnValueOnce({ is_secure_register: 1 });
165+
mockGetApplicationData.mockReturnValueOnce({ is_secure_register: 1 });
166166
const resp = await request(app).get(SECURE_REGISTER_FILTER_URL);
167167

168168
expect(resp.status).toEqual(200);
@@ -194,10 +194,10 @@ describe( "SECURE REGISTER FILTER controller", () => {
194194

195195
test(`renders the ${config.USE_PAPER_PAGE} page when yes is selected and REDIS_removal flag is set to ON`, async () => {
196196
mockIsActiveFeature.mockReturnValueOnce(true);
197-
mockGetApplicationData.mockReturnValueOnce(APPLICATION_DATA_MOCK);
197+
mockGetApplicationData.mockReturnValue(APPLICATION_DATA_MOCK);
198198
mockIsActiveFeature.mockReturnValueOnce(true);
199-
mockIsRemoveJourney.mockReturnValueOnce(false);
200-
mockUpdateOverseasEntity.mockReturnValueOnce(true);
199+
mockIsRemoveJourney.mockReturnValue(false);
200+
mockUpdateOverseasEntity.mockReturnValue(true);
201201
const resp = await request(app)
202202
.post(config.SECURE_REGISTER_FILTER_URL)
203203
.send({ is_secure_register: "1" });
@@ -223,10 +223,8 @@ describe( "SECURE REGISTER FILTER controller", () => {
223223
});
224224

225225
test(`renders the ${config.INTERRUPT_CARD_PAGE} page when no is selected and REDIS_removal flag is set to ON`, async () => {
226-
mockIsActiveFeature.mockReturnValueOnce(true);
227-
mockIsActiveFeature.mockReturnValueOnce(true);
226+
mockIsActiveFeature.mockReturnValue(true);
228227
mockGetApplicationData.mockReturnValueOnce(APPLICATION_DATA_MOCK);
229-
mockIsActiveFeature.mockReturnValueOnce(true);
230228
mockIsRemoveJourney.mockReturnValueOnce(false);
231229
mockUpdateOverseasEntity.mockReturnValueOnce(true);
232230
mockGetUrlWithTransactionIdAndSubmissionId.mockReturnValueOnce(config.INTERRUPT_CARD_WITH_PARAMS_URL);

0 commit comments

Comments
 (0)