Skip to content

Commit c7fc7d2

Browse files
authored
Merge pull request #1754 from companieshouse/feat/cc-3051/redirecting-from-to-the-interrupt-page-with-entity-ids
feat/cc 3051/redirecting from to the interrupt page with entity ids when ROE flag is Set
2 parents 802fd75 + f253bfd commit c7fc7d2

File tree

4 files changed

+99
-28
lines changed

4 files changed

+99
-28
lines changed

src/controllers/update/overseas.entity.query.controller.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { mapCompanyProfileToOverseasEntity } from "../../utils/update/company.pr
1111
import { mapInputDate } from "../../utils/update/mapper.utils";
1212
import { CompanyProfile } from "@companieshouse/api-sdk-node/dist/services/company-profile/types";
1313
import { retrieveBoAndMoData } from "../../utils/update/beneficial_owners_managing_officers_data_fetch";
14-
import { isRemoveJourney } from "../../utils/url";
14+
import { getBackLinkUrl, isRemoveJourney } from "../../utils/url";
1515

1616
export const get = async (req: Request, res: Response, next: NextFunction) => {
1717
try {
@@ -29,8 +29,14 @@ export const get = async (req: Request, res: Response, next: NextFunction) => {
2929
});
3030
}
3131

32+
const backLinkUrl = getBackLinkUrl({
33+
req,
34+
urlWithEntityIds: config.UPDATE_INTERRUPT_CARD_WITH_PARAMS_URL,
35+
urlWithoutEntityIds: config.UPDATE_INTERRUPT_CARD_URL,
36+
});
37+
3238
return res.render(config.OVERSEAS_ENTITY_QUERY_PAGE, {
33-
backLinkUrl: config.UPDATE_INTERRUPT_CARD_URL,
39+
backLinkUrl,
3440
templateName: config.OVERSEAS_ENTITY_QUERY_PAGE,
3541
chsUrl: process.env.CHS_URL,
3642
[EntityNumberKey]: appData[EntityNumberKey]

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

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

119
export const get = async (req: Request, res: Response, next: NextFunction) => {
@@ -23,8 +21,14 @@ export const get = async (req: Request, res: Response, next: NextFunction) => {
2321
});
2422
}
2523

24+
const backLinkUrl = getBackLinkUrl({
25+
req,
26+
urlWithEntityIds: config.SECURE_UPDATE_FILTER_WITH_PARAMS_URL,
27+
urlWithoutEntityIds: config.SECURE_UPDATE_FILTER_URL,
28+
});
29+
2630
return res.render(config.UPDATE_INTERRUPT_CARD_PAGE, {
27-
backLinkUrl: getBackLinkUrl(req),
31+
backLinkUrl,
2832
templateName: config.UPDATE_INTERRUPT_CARD_PAGE,
2933
});
3034
} catch (error) {
@@ -49,23 +53,3 @@ export const post = async (req: Request, res: Response, next: NextFunction) => {
4953
next(error);
5054
}
5155
};
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/utils/url.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,43 @@ import { getApplicationData } from "./application.data";
55
import { Session } from "@companieshouse/node-session-handler";
66
import { IsRemoveKey } from "../model/data.types.model";
77
import { createAndLogErrorRequest, logger } from "./logger";
8+
import { isActiveFeature } from "./feature.flag";
89

10+
interface BackLinkUrlDependencies {
11+
req: Request;
12+
urlWithEntityIds: string;
13+
urlWithoutEntityIds: string;
14+
}
915
export interface TransactionIdAndSubmissionId {
1016
transactionId: string;
1117
submissionId: string;
1218
}
1319

20+
export const getBackLinkUrl = ({
21+
req,
22+
urlWithEntityIds,
23+
urlWithoutEntityIds,
24+
}: BackLinkUrlDependencies): string => {
25+
try {
26+
const ids = getTransactionIdAndSubmissionIdFromOriginalUrl(req);
27+
28+
if (
29+
!isActiveFeature(config.FEATURE_FLAG_ENABLE_REDIS_REMOVAL) ||
30+
typeof ids === "undefined"
31+
) {
32+
return urlWithoutEntityIds;
33+
}
34+
return getUrlWithTransactionIdAndSubmissionId(
35+
urlWithEntityIds,
36+
ids[config.ROUTE_PARAM_TRANSACTION_ID],
37+
ids[config.ROUTE_PARAM_SUBMISSION_ID]
38+
);
39+
} catch (error) {
40+
logger.errorRequest(req, error);
41+
return urlWithoutEntityIds;
42+
}
43+
};
44+
1445
export const getUrlWithTransactionIdAndSubmissionId = (url: string, transactionId: string, submissionId: string): string => {
1546
url = url
1647
.replace(`:${config.ROUTE_PARAM_TRANSACTION_ID}`, transactionId)

test/utils/url.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import { expect, jest } from "@jest/globals";
22

33
jest.mock('../../src/utils/application.data');
44
jest.mock("../../src/utils/logger");
5+
jest.mock("../../src/utils/feature.flag");
56

67
import { Request, request } from "express";
78
import * as config from "../../src/config";
89
import * as urlUtils from "../../src/utils/url";
910
import { getApplicationData } from '../../src/utils/application.data';
1011
import { APPLICATION_DATA_MOCK } from "../__mocks__/session.mock";
1112
import { createAndLogErrorRequest, logger } from "../../src/utils/logger";
13+
import { isActiveFeature } from "../../src/utils/feature.flag";
1214

1315
const mockGetApplicationData = getApplicationData as jest.Mock;
1416
const mockCreateAndLogErrorRequest = createAndLogErrorRequest as jest.Mock;
@@ -391,4 +393,52 @@ describe("Url utils tests", () => {
391393
expect(previousPage).toBeUndefined();
392394
});
393395
});
396+
397+
describe("getBackLinkUrl tests", () => {
398+
const urlWithEntityIds = "/transaction/:transactionId/submission/:submissionId/entity";
399+
const urlWithoutEntityIds = "/entity";
400+
const transactionId = "tx123";
401+
const submissionId = "sub456";
402+
const mockIsActiveFeature = isActiveFeature as jest.Mock;
403+
404+
beforeEach(() => {
405+
jest.spyOn(urlUtils, "getTransactionIdAndSubmissionIdFromOriginalUrl").mockImplementation(() => ({
406+
transactionId,
407+
submissionId
408+
}));
409+
jest.spyOn(urlUtils, "getUrlWithTransactionIdAndSubmissionId").mockImplementation((url, tId, sId) => {
410+
return url.replace(":transactionId", tId).replace(":submissionId", sId);
411+
});
412+
jest.clearAllMocks();
413+
});
414+
415+
test("returns url with entity ids when feature flag is enabled and ids are present", () => {
416+
mockIsActiveFeature.mockReturnValueOnce(true);
417+
const req = { originalUrl: "/transaction/tx123/submission/sub456", params: {}, query: {} } as unknown as Request;
418+
const result = urlUtils.getBackLinkUrl({ req, urlWithEntityIds, urlWithoutEntityIds });
419+
expect(result).toBe("/transaction/tx123/submission/sub456/entity");
420+
});
421+
422+
test("returns urlWithoutEntityIds when feature flag is disabled", () => {
423+
mockIsActiveFeature.mockReturnValueOnce(false);
424+
const req = { originalUrl: "/transaction/tx123/submission/sub456", params: {}, query: {} } as unknown as Request;
425+
const result = urlUtils.getBackLinkUrl({ req, urlWithEntityIds, urlWithoutEntityIds });
426+
expect(result).toBe(urlWithoutEntityIds);
427+
});
428+
429+
test("returns urlWithoutEntityIds when ids are undefined", () => {
430+
jest.spyOn(urlUtils, "getTransactionIdAndSubmissionIdFromOriginalUrl").mockReturnValue(undefined);
431+
const req = { originalUrl: "/no-ids-here", params: {}, query: {} } as unknown as Request;
432+
const result = urlUtils.getBackLinkUrl({ req, urlWithEntityIds, urlWithoutEntityIds });
433+
expect(result).toBe(urlWithoutEntityIds);
434+
});
435+
436+
test("returns urlWithoutEntityIds and logs error if exception is thrown", () => {
437+
jest.spyOn(urlUtils, "getTransactionIdAndSubmissionIdFromOriginalUrl").mockImplementation(() => { throw new Error("fail"); });
438+
const req = { originalUrl: "/fail", params: {}, query: {} } as unknown as Request;
439+
const result = urlUtils.getBackLinkUrl({ req, urlWithEntityIds, urlWithoutEntityIds });
440+
expect(result).toBe(urlWithoutEntityIds);
441+
expect(logger.errorRequest).toHaveBeenCalled();
442+
});
443+
});
394444
});

0 commit comments

Comments
 (0)