Skip to content

Commit 6a8bf78

Browse files
committed
CCM-100547: add campaignId to template
1 parent e9443ec commit 6a8bf78

File tree

20 files changed

+664
-86
lines changed

20 files changed

+664
-86
lines changed

infrastructure/terraform/modules/backend-api/locals.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ locals {
3939
}
4040

4141
backend_lambda_environment_variables = {
42+
CLIENT_CONFIG_SSM_KEY_PREFIX = "${var.csi}/clients"
4243
DEFAULT_LETTER_SUPPLIER = local.default_letter_supplier_name
4344
ENVIRONMENT = var.environment
4445
NODE_OPTIONS = "--enable-source-maps"

lambdas/backend-api/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"@aws-sdk/client-dynamodb": "3.775.0",
55
"@aws-sdk/client-s3": "3.775.0",
66
"@aws-sdk/client-sqs": "3.775.0",
7+
"@aws-sdk/client-ssm": "3.775.0",
78
"@aws-sdk/lib-dynamodb": "3.775.0",
89
"@aws-sdk/util-dynamodb": "3.775.0",
910
"csv-parse": "^5.6.0",
@@ -14,6 +15,7 @@
1415
"nhs-notify-backend-client": "^0.0.1",
1516
"nhs-notify-entity-update-command-builder": "^0.0.1",
1617
"nhs-notify-web-template-management-utils": "^0.0.1",
18+
"node-cache": "^5.1.2",
1719
"parse-multipart-data": "^1.5.0",
1820
"pdfjs-dist": "5.1.91",
1921
"winston": "^3.17.0",

lambdas/backend-api/src/__tests__/templates/app/template-client.test.ts

Lines changed: 108 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DatabaseTemplate } from 'nhs-notify-web-template-management-utils';
1212
import { ProofingQueue } from '@backend-api/templates/infra/proofing-queue';
1313
import { createMockLogger } from 'nhs-notify-web-template-management-test-helper-utils/mock-logger';
1414
import { isoDateRegExp } from 'nhs-notify-web-template-management-test-helper-utils';
15+
import { ClientConfigRepository } from '@backend-api/templates/infra/client-config-repository';
1516

1617
jest.mock('node:crypto');
1718

@@ -27,19 +28,28 @@ const setup = () => {
2728

2829
const queueMock = mock<ProofingQueue>();
2930

31+
const clientConfigRepository = mock<ClientConfigRepository>();
32+
3033
const { logger, logMessages } = createMockLogger();
3134

3235
const templateClient = new TemplateClient(
3336
templateRepository,
3437
letterUploadRepository,
3538
queueMock,
3639
defaultLetterSupplier,
40+
clientConfigRepository,
3741
logger
3842
);
3943

4044
return {
4145
templateClient,
42-
mocks: { templateRepository, letterUploadRepository, queueMock, logger },
46+
mocks: {
47+
templateRepository,
48+
letterUploadRepository,
49+
queueMock,
50+
logger,
51+
clientConfigRepository,
52+
},
4353
logMessages,
4454
};
4555
};
@@ -118,7 +128,8 @@ describe('templateClient', () => {
118128
data,
119129
user.userId,
120130
user.clientId,
121-
'NOT_YET_SUBMITTED'
131+
'NOT_YET_SUBMITTED',
132+
undefined
122133
);
123134

124135
expect(result).toEqual({
@@ -163,7 +174,8 @@ describe('templateClient', () => {
163174
data,
164175
user.userId,
165176
user.clientId,
166-
'NOT_YET_SUBMITTED'
177+
'NOT_YET_SUBMITTED',
178+
undefined
167179
);
168180

169181
expect(result).toEqual({
@@ -195,20 +207,29 @@ describe('templateClient', () => {
195207
const template: DatabaseTemplate = {
196208
...expectedTemplateDto,
197209
owner: user.userId,
210+
campaignId: 'campaignId',
198211
version: 1,
199212
};
200213

201214
mocks.templateRepository.create.mockResolvedValueOnce({
202215
data: template,
203216
});
204217

218+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
219+
campaignId: 'campaignId',
220+
features: {
221+
proofing: true,
222+
},
223+
});
224+
205225
const result = await templateClient.createTemplate(data, user);
206226

207227
expect(mocks.templateRepository.create).toHaveBeenCalledWith(
208228
data,
209229
user.userId,
210230
user.clientId,
211-
'NOT_YET_SUBMITTED'
231+
'NOT_YET_SUBMITTED',
232+
'campaignId'
212233
);
213234

214235
expect(result).toEqual({
@@ -291,12 +312,18 @@ describe('templateClient', () => {
291312
data: finalTemplate,
292313
});
293314

315+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
316+
campaignId: 'campaignId',
317+
features: {
318+
proofing: true,
319+
},
320+
});
321+
294322
const result = await templateClient.createLetterTemplate(
295323
data,
296324
user,
297325
pdf,
298-
csv,
299-
'campaignId'
326+
csv
300327
);
301328

302329
expect(result).toEqual({
@@ -307,7 +334,8 @@ describe('templateClient', () => {
307334
dataWithFiles,
308335
user.userId,
309336
user.clientId,
310-
'PENDING_UPLOAD'
337+
'PENDING_UPLOAD',
338+
'campaignId'
311339
);
312340

313341
expect(mocks.letterUploadRepository.upload).toHaveBeenCalledWith(
@@ -524,7 +552,8 @@ describe('templateClient', () => {
524552
dataWithFiles,
525553
user.userId,
526554
user.clientId,
527-
'PENDING_UPLOAD'
555+
'PENDING_UPLOAD',
556+
undefined
528557
);
529558

530559
expect(mocks.letterUploadRepository.upload).not.toHaveBeenCalled();
@@ -637,7 +666,8 @@ describe('templateClient', () => {
637666
dataWithFiles,
638667
user.userId,
639668
user.clientId,
640-
'PENDING_UPLOAD'
669+
'PENDING_UPLOAD',
670+
undefined
641671
);
642672

643673
expect(mocks.letterUploadRepository.upload).toHaveBeenCalledWith(
@@ -721,7 +751,8 @@ describe('templateClient', () => {
721751
dataWithFiles,
722752
user.userId,
723753
user.clientId,
724-
'PENDING_UPLOAD'
754+
'PENDING_UPLOAD',
755+
undefined
725756
);
726757

727758
expect(mocks.letterUploadRepository.upload).toHaveBeenCalledWith(
@@ -1293,11 +1324,7 @@ describe('templateClient', () => {
12931324
test('should return a failure result, when proofing is disabled', async () => {
12941325
const { templateClient, mocks } = setup();
12951326

1296-
const result = await templateClient.requestProof(
1297-
templateId,
1298-
owner,
1299-
false
1300-
);
1327+
const result = await templateClient.requestProof(templateId, user);
13011328

13021329
expect(
13031330
mocks.templateRepository.proofRequestUpdate
@@ -1306,7 +1333,7 @@ describe('templateClient', () => {
13061333
expect(result).toEqual({
13071334
error: {
13081335
code: 403,
1309-
message: 'User can not request a proof',
1336+
message: 'User cannot request a proof',
13101337
},
13111338
});
13121339
});
@@ -1324,6 +1351,13 @@ describe('templateClient', () => {
13241351
},
13251352
});
13261353

1354+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1355+
campaignId: 'campaignId',
1356+
features: {
1357+
proofing: true,
1358+
},
1359+
});
1360+
13271361
const result = await templateClient.requestProof(templateId, user);
13281362

13291363
expect(mocks.templateRepository.proofRequestUpdate).toHaveBeenCalledWith(
@@ -1374,6 +1408,13 @@ describe('templateClient', () => {
13741408
data: template,
13751409
});
13761410

1411+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1412+
campaignId: 'campaignId',
1413+
features: {
1414+
proofing: true,
1415+
},
1416+
});
1417+
13771418
const result = await templateClient.requestProof(templateId, user);
13781419

13791420
expect(mocks.templateRepository.proofRequestUpdate).toHaveBeenCalledWith(
@@ -1414,6 +1455,13 @@ describe('templateClient', () => {
14141455
data: template,
14151456
});
14161457

1458+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1459+
campaignId: 'campaignId',
1460+
features: {
1461+
proofing: true,
1462+
},
1463+
});
1464+
14171465
const result = await templateClient.requestProof(templateId, user);
14181466

14191467
expect(mocks.templateRepository.proofRequestUpdate).toHaveBeenCalledWith(
@@ -1468,6 +1516,13 @@ describe('templateClient', () => {
14681516
},
14691517
});
14701518

1519+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1520+
campaignId: 'campaignId',
1521+
features: {
1522+
proofing: true,
1523+
},
1524+
});
1525+
14711526
const result = await templateClient.requestProof(templateId, user);
14721527

14731528
expect(mocks.templateRepository.proofRequestUpdate).toHaveBeenCalledWith(
@@ -1494,6 +1549,36 @@ describe('templateClient', () => {
14941549
});
14951550
});
14961551

1552+
test('should return a failure result, when proofing is not enabled', async () => {
1553+
const { templateClient, mocks } = setup();
1554+
1555+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1556+
campaignId: 'campaignId',
1557+
features: {
1558+
proofing: false,
1559+
},
1560+
});
1561+
1562+
const result = await templateClient.requestProof(templateId, user);
1563+
1564+
expect(mocks.clientConfigRepository.get).toHaveBeenCalledWith(
1565+
user.userId
1566+
);
1567+
1568+
expect(
1569+
mocks.templateRepository.proofRequestUpdate
1570+
).not.toHaveBeenCalled();
1571+
1572+
expect(mocks.queueMock.send).not.toHaveBeenCalled();
1573+
1574+
expect(result).toEqual({
1575+
error: {
1576+
code: 403,
1577+
message: 'User cannot request a proof',
1578+
},
1579+
});
1580+
});
1581+
14971582
test('should return updated template', async () => {
14981583
const { templateClient, mocks } = setup();
14991584

@@ -1519,6 +1604,13 @@ describe('templateClient', () => {
15191604
},
15201605
};
15211606

1607+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
1608+
campaignId: 'campaignId',
1609+
features: {
1610+
proofing: true,
1611+
},
1612+
});
1613+
15221614
mocks.templateRepository.proofRequestUpdate.mockResolvedValueOnce({
15231615
data: { ...template, owner: user.userId, version: 1 },
15241616
});

0 commit comments

Comments
 (0)