Skip to content

Commit c4d6b49

Browse files
VIA-304 SB Break links between the URL our app uses for a vaccs page, the cache filename, the content API path, and the NBS redirect query string.
Also, consolidate all these bits of info into a single place.
1 parent e0d2670 commit c4d6b49

File tree

12 files changed

+110
-145
lines changed

12 files changed

+110
-145
lines changed

src/_lambda/content-cache-hydrator/content-cache-reader.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import {
22
ReadCachedContentResult,
33
readCachedContentForVaccine,
44
} from "@src/_lambda/content-cache-hydrator/content-cache-reader";
5-
import { VaccineTypes } from "@src/models/vaccine";
6-
import { vaccineTypeToPath } from "@src/services/content-api/constants";
5+
import { VaccineInfo, VaccineTypes } from "@src/models/vaccine";
76
import { readContentFromCache } from "@src/services/content-api/gateway/content-reader-service";
87
import { InvalidatedCacheError, S3NoSuchKeyError } from "@src/services/content-api/gateway/exceptions";
98
import { AppConfig, configProvider } from "@src/utils/config";
@@ -32,7 +31,7 @@ describe("readCachedContentForVaccine", () => {
3231

3332
expect(readContentFromCache).toHaveBeenCalledWith(
3433
mockContentCachePath,
35-
`${vaccineTypeToPath[vaccineType]}.json`,
34+
VaccineInfo[vaccineType].cacheFilename,
3635
vaccineType,
3736
);
3837
expect(cacheContent).toBe(mockCacheFileContents);

src/_lambda/content-cache-hydrator/content-cache-reader.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { VaccineTypes } from "@src/models/vaccine";
2-
import { VaccineContentPaths, vaccineTypeToPath } from "@src/services/content-api/constants";
1+
import { Filename, VaccineInfo, VaccineTypes } from "@src/models/vaccine";
32
import { readContentFromCache } from "@src/services/content-api/gateway/content-reader-service";
43
import { InvalidatedCacheError, S3NoSuchKeyError } from "@src/services/content-api/gateway/exceptions";
54
import { AppConfig, configProvider } from "@src/utils/config";
@@ -14,11 +13,11 @@ export interface ReadCachedContentResult {
1413

1514
const readCachedContentForVaccine = async (vaccineType: VaccineTypes): Promise<ReadCachedContentResult> => {
1615
const config: AppConfig = await configProvider();
17-
const vaccineContentPath: VaccineContentPaths = vaccineTypeToPath[vaccineType];
16+
const cacheFilename: Filename = VaccineInfo[vaccineType].cacheFilename;
1817
let cachedContent: string;
1918

2019
try {
21-
cachedContent = await readContentFromCache(config.CONTENT_CACHE_PATH, `${vaccineContentPath}.json`, vaccineType);
20+
cachedContent = await readContentFromCache(config.CONTENT_CACHE_PATH, cacheFilename, vaccineType);
2221
} catch (error) {
2322
if (error instanceof S3NoSuchKeyError) {
2423
return { cacheStatus: "empty", cacheContent: "" };

src/_lambda/content-cache-hydrator/content-fetcher.test.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { CONTENT_API_PATH_PREFIX, fetchContentForVaccine } from "@src/_lambda/content-cache-hydrator/content-fetcher";
2-
import { VaccineTypes } from "@src/models/vaccine";
3-
import { vaccineTypeToPath } from "@src/services/content-api/constants";
2+
import { VaccineInfo, VaccineTypes } from "@src/models/vaccine";
43
import { AppConfig, configProvider } from "@src/utils/config";
54
import axios from "axios";
65

@@ -26,13 +25,10 @@ describe("fetchContentForVaccine", () => {
2625
it("should fetch content for vaccine", async () => {
2726
(axios.get as jest.Mock).mockResolvedValue({ data: testApiContent });
2827
const actual = await fetchContentForVaccine(VaccineTypes.RSV);
29-
expect(axios.get).toHaveBeenCalledWith(`${testApiEndpoint}${CONTENT_API_PATH_PREFIX}${vaccineTypeToPath.RSV}`, {
30-
headers: {
31-
accept: "application/json",
32-
apikey: testApiKey,
33-
},
34-
timeout: 30000,
35-
});
28+
expect(axios.get).toHaveBeenCalledWith(
29+
`${testApiEndpoint}${CONTENT_API_PATH_PREFIX}${VaccineInfo[VaccineTypes.RSV].contentPath}`,
30+
{ headers: { accept: "application/json", apikey: testApiKey }, timeout: 30000 },
31+
);
3632
expect(actual).toBe(JSON.stringify(testApiContent));
3733
});
3834

src/_lambda/content-cache-hydrator/content-fetcher.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import { VaccineTypes } from "@src/models/vaccine";
2-
import { VaccineContentPaths, vaccineTypeToPath } from "@src/services/content-api/constants";
1+
import { VaccineInfo, VaccineTypes } from "@src/models/vaccine";
32
import { AppConfig, configProvider } from "@src/utils/config";
43
import { logger } from "@src/utils/logger";
54
import axios, { AxiosError, AxiosResponse } from "axios";
65

76
const log = logger.child({ module: "content-fetcher" });
8-
const CONTENT_API_PATH_PREFIX = "nhs-website-content/vaccinations/";
7+
const CONTENT_API_PATH_PREFIX = "nhs-website-content/";
98

109
const fetchContentForVaccine = async (vaccineType: VaccineTypes): Promise<string> => {
1110
const config: AppConfig = await configProvider();
1211

1312
const apiEndpoint: URL = config.CONTENT_API_ENDPOINT;
14-
const vaccinePath: VaccineContentPaths = vaccineTypeToPath[vaccineType];
13+
const vaccinePath = VaccineInfo[vaccineType].contentPath;
1514
const apiKey: string = config.CONTENT_API_KEY;
1615

1716
const uri: string = `${apiEndpoint}${CONTENT_API_PATH_PREFIX}${vaccinePath}`;

src/_lambda/content-cache-hydrator/content-writer-service.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import {
77
_writeFileS3,
88
writeContentForVaccine,
99
} from "@src/_lambda/content-cache-hydrator/content-writer-service";
10-
import { VaccineTypes } from "@src/models/vaccine";
11-
import { vaccineTypeToPath } from "@src/services/content-api/constants";
10+
import { Filename, VaccineInfo, VaccineTypes } from "@src/models/vaccine";
1211
import { configProvider } from "@src/utils/config";
1312
import { writeFile } from "node:fs/promises";
1413

@@ -27,8 +26,8 @@ jest.mock("@aws-sdk/client-s3", () => {
2726
jest.mock("sanitize-data", () => ({ sanitize: jest.fn() }));
2827

2928
describe("Content Writer Service", () => {
30-
const location: string = "test-location";
31-
const path: string = "/test-path";
29+
const location: string = "test-location/";
30+
const path: Filename = "test-filename.json" as Filename;
3231
const content: string = "test-data";
3332

3433
beforeEach(() => {
@@ -82,7 +81,7 @@ describe("Content Writer Service", () => {
8281
it("should return response for rsv vaccine from content cache", async () => {
8382
const vaccine: VaccineTypes = VaccineTypes.RSV;
8483
await writeContentForVaccine(vaccine, content);
85-
expect(writeFile).toHaveBeenCalledWith(`${location}${vaccineTypeToPath[vaccine]}.json`, content);
84+
expect(writeFile).toHaveBeenCalledWith(`${location}${VaccineInfo[VaccineTypes.RSV].cacheFilename}`, content);
8685
});
8786
});
8887
});

src/_lambda/content-cache-hydrator/content-writer-service.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
2-
import { VaccineTypes } from "@src/models/vaccine";
3-
import { vaccineTypeToPath } from "@src/services/content-api/constants";
2+
import { Filename, VaccineInfo, VaccineTypes } from "@src/models/vaccine";
43
import { AppConfig, configProvider } from "@src/utils/config";
54
import { AWS_PRIMARY_REGION } from "@src/utils/constants";
65
import { logger } from "@src/utils/logger";
@@ -28,16 +27,20 @@ const _writeFileS3 = async (bucket: string, key: string, data: string): Promise<
2827
}
2928
};
3029

31-
const _writeContentToCache = async (cacheLocation: string, cachePath: string, cacheContent: string): Promise<void> => {
30+
const _writeContentToCache = async (
31+
cacheLocation: string,
32+
cachePath: Filename,
33+
cacheContent: string,
34+
): Promise<void> => {
3235
return isS3Path(cacheLocation)
3336
? await _writeFileS3(cacheLocation.slice(S3_PREFIX.length), cachePath, cacheContent)
3437
: await writeFile(`${cacheLocation}${cachePath}`, cacheContent);
3538
};
3639

3740
const writeContentForVaccine = async (vaccineType: VaccineTypes, vaccineContent: string) => {
3841
const config: AppConfig = await configProvider();
39-
const vaccineContentPath = vaccineTypeToPath[vaccineType];
40-
await _writeContentToCache(config.CONTENT_CACHE_PATH, `${vaccineContentPath}.json`, vaccineContent);
42+
const cacheFilename = VaccineInfo[vaccineType].cacheFilename;
43+
await _writeContentToCache(config.CONTENT_CACHE_PATH, cacheFilename, vaccineContent);
4144
};
4245

4346
export { _writeFileS3, _writeContentToCache, writeContentForVaccine };

src/app/_components/nbs/NBSBookingAction.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { useBrowserContext } from "@src/app/_components/context/BrowserContext";
44
import { SSO_TO_NBS_ROUTE } from "@src/app/api/sso-to-nbs/constants";
5-
import { VaccineContentUrlPaths, vaccineTypeToUrlPath } from "@src/models/vaccine";
5+
import { UrlPathFragment, VaccineInfo } from "@src/models/vaccine";
66
import { VaccinesWithNBSBookingAvailable } from "@src/services/nbs/nbs-service";
77
import { ActionLink } from "nhsuk-react-components";
88
import React, { JSX } from "react";
@@ -38,7 +38,7 @@ const NBSBookingActionForVaccine = ({
3838
renderAs,
3939
reduceBottomPadding = false,
4040
}: NBSBookingActionForVaccineProps): JSX.Element => {
41-
const vaccinePath: VaccineContentUrlPaths = vaccineTypeToUrlPath[vaccineType];
41+
const vaccinePath: UrlPathFragment = VaccineInfo[vaccineType].nboPath;
4242
const nbsSSOLink = `${SSO_TO_NBS_ROUTE}?vaccine=${vaccinePath}`;
4343

4444
return (

src/app/vaccines-for-all-ages/page.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import CardLink from "@src/app/_components/nhs-app/CardLink";
22
import BackLink from "@src/app/_components/nhs-frontend/BackLink";
33
import MainContent from "@src/app/_components/nhs-frontend/MainContent";
44
import { NHS_TITLE_SUFFIX, VACCINES_FOR_ALL_AGES_PAGE } from "@src/app/constants";
5-
import { VaccineContentUrlPaths, VaccineInfo, VaccineTypes } from "@src/models/vaccine";
5+
import { VaccineInfo, VaccineTypes } from "@src/models/vaccine";
66
import React, { JSX } from "react";
77

88
const VaccinesForAllAges = (): JSX.Element => {
@@ -21,74 +21,74 @@ const VaccinesForAllAges = (): JSX.Element => {
2121
<ul className="nhsapp-cards nhsapp-cards--stacked" data-testid={"vaccine-cardlinks-adults"}>
2222
<CardLink
2323
title={`${VaccineInfo[VaccineTypes.RSV].cardLinkTitle}`}
24-
link={`/vaccines/${VaccineContentUrlPaths.RSV}`}
24+
link={`/vaccines/${VaccineInfo.RSV.urlPath}`}
2525
/>
2626
<CardLink
2727
title={`${VaccineInfo[VaccineTypes.SHINGLES].cardLinkTitle}`}
28-
link={`/vaccines/${VaccineContentUrlPaths.SHINGLES}`}
28+
link={`/vaccines/${VaccineInfo.SHINGLES.urlPath}`}
2929
/>
3030
<CardLink
3131
title={`${VaccineInfo[VaccineTypes.PNEUMOCOCCAL].cardLinkTitle}`}
32-
link={`/vaccines/${VaccineContentUrlPaths.PNEUMOCOCCAL}`}
32+
link={`/vaccines/${VaccineInfo.PNEUMOCOCCAL.urlPath}`}
3333
/>
3434
</ul>
3535

3636
<h2 className="nhsuk-heading-s">Vaccines for pregnancy</h2>
3737
<ul className="nhsapp-cards nhsapp-cards--stacked" data-testid="vaccine-cardlinks-pregnancy">
3838
<CardLink
3939
title={`${VaccineInfo[VaccineTypes.RSV_PREGNANCY].cardLinkTitle}`}
40-
link={`/vaccines/${VaccineContentUrlPaths.RSV_PREGNANCY}`}
40+
link={`/vaccines/${VaccineInfo.RSV_PREGNANCY.urlPath}`}
4141
/>
4242
</ul>
4343

4444
<h2 className="nhsuk-heading-s">Vaccines for children aged 1 to 15</h2>
4545
<ul className="nhsapp-cards nhsapp-cards--stacked" data-testid="vaccine-cardlinks-children">
4646
<CardLink
4747
title={`${VaccineInfo[VaccineTypes.TD_IPV_3_IN_1].cardLinkTitle}`}
48-
link={`/vaccines/${VaccineContentUrlPaths.TD_IPV_3_IN_1}`}
48+
link={`/vaccines/${VaccineInfo.TD_IPV_3_IN_1.urlPath}`}
4949
/>
5050
<CardLink
5151
title={`${VaccineInfo[VaccineTypes.MENACWY].cardLinkTitle}`}
52-
link={`/vaccines/${VaccineContentUrlPaths.MENACWY}`}
52+
link={`/vaccines/${VaccineInfo.MENACWY.urlPath}`}
5353
/>
5454
<CardLink
5555
title={`${VaccineInfo[VaccineTypes.HPV].cardLinkTitle}`}
56-
link={`/vaccines/${VaccineContentUrlPaths.HPV}`}
56+
link={`/vaccines/${VaccineInfo.HPV.urlPath}`}
5757
/>
5858
<CardLink
5959
title={`${VaccineInfo[VaccineTypes.VACCINE_4_IN_1].cardLinkTitle}`}
60-
link={`/vaccines/${VaccineContentUrlPaths.VACCINE_4_IN_1}`}
60+
link={`/vaccines/${VaccineInfo.VACCINE_4_IN_1.urlPath}`}
6161
/>
6262
<CardLink
6363
title={`${VaccineInfo[VaccineTypes.MMR].cardLinkTitle}`}
64-
link={`/vaccines/${VaccineContentUrlPaths.MMR}`}
64+
link={`/vaccines/${VaccineInfo.MMR.urlPath}`}
6565
/>
6666
<CardLink
6767
title={`${VaccineInfo[VaccineTypes.MENB_CHILDREN].cardLinkTitle}`}
68-
link={`/vaccines/${VaccineContentUrlPaths.MENB_CHILDREN}`}
68+
link={`/vaccines/${VaccineInfo.MENB_CHILDREN.urlPath}`}
6969
/>
7070
<CardLink
7171
title={`${VaccineInfo[VaccineTypes.PNEUMOCOCCAL].cardLinkTitle}`}
72-
link={`/vaccines/${VaccineContentUrlPaths.PNEUMOCOCCAL}`}
72+
link={`/vaccines/${VaccineInfo.PNEUMOCOCCAL.urlPath}`}
7373
/>
7474
</ul>
7575
<h2 className="nhsuk-heading-s">Vaccines for babies under 1 year old</h2>
7676
<ul className="nhsapp-cards nhsapp-cards--stacked" data-testid={"vaccine-cardlinks-babies"}>
7777
<CardLink
7878
title={`${VaccineInfo[VaccineTypes.VACCINE_6_IN_1].cardLinkTitle}`}
79-
link={`/vaccines/${VaccineContentUrlPaths.VACCINE_6_IN_1}`}
79+
link={`/vaccines/${VaccineInfo.VACCINE_6_IN_1.urlPath}`}
8080
/>
8181
<CardLink
8282
title={`${VaccineInfo[VaccineTypes.ROTAVIRUS].cardLinkTitle}`}
83-
link={`/vaccines/${VaccineContentUrlPaths.ROTAVIRUS}`}
83+
link={`/vaccines/${VaccineInfo.ROTAVIRUS.urlPath}`}
8484
/>
8585
<CardLink
8686
title={`${VaccineInfo[VaccineTypes.PNEUMOCOCCAL].cardLinkTitle}`}
87-
link={`/vaccines/${VaccineContentUrlPaths.PNEUMOCOCCAL}`}
87+
link={`/vaccines/${VaccineInfo.PNEUMOCOCCAL.urlPath}`}
8888
/>
8989
<CardLink
9090
title={`${VaccineInfo[VaccineTypes.MENB_CHILDREN].cardLinkTitle}`}
91-
link={`/vaccines/${VaccineContentUrlPaths.MENB_CHILDREN}`}
91+
link={`/vaccines/${VaccineInfo.MENB_CHILDREN.urlPath}`}
9292
/>
9393
</ul>
9494
</MainContent>

0 commit comments

Comments
 (0)