Skip to content

Commit 6127fc2

Browse files
committed
review comments
1 parent 70fd89f commit 6127fc2

File tree

3 files changed

+104
-41
lines changed

3 files changed

+104
-41
lines changed

lambdas/backend-api/src/__tests__/templates/api/validate-letter-template-files.test.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,68 @@ describe('guard duty handler', () => {
683683
).not.toHaveBeenCalled();
684684
});
685685

686+
test('does not attempt to fetch client configuration if no clientId', async () => {
687+
const { handler, mocks } = setup();
688+
689+
const event = makeGuardDutyMalwareScanResultNotificationEvent({
690+
detail: {
691+
s3ObjectDetails: {
692+
bucketName: 'quarantine-bucket',
693+
objectKey: `pdf-template/${owner}/${templateId}/${versionId}.pdf`,
694+
},
695+
scanResultDetails: {
696+
scanResultStatus: 'NO_THREATS_FOUND',
697+
},
698+
},
699+
});
700+
701+
const template = mock<DatabaseTemplate>({
702+
files: {
703+
pdfTemplate: {
704+
fileName: '',
705+
virusScanStatus: 'PASSED',
706+
currentVersion: versionId,
707+
},
708+
testDataCsv: undefined,
709+
},
710+
templateStatus: 'PENDING_VALIDATION',
711+
language: 'en',
712+
owner,
713+
clientId: undefined,
714+
});
715+
716+
mocks.templateRepository.get.mockResolvedValueOnce({
717+
data: template,
718+
});
719+
720+
mocks.letterUploadRepository.download.mockResolvedValueOnce(
721+
Uint8Array.from('pdf')
722+
);
723+
724+
const pdf = mock<TemplatePdf>({
725+
personalisationParameters: ['a'],
726+
});
727+
728+
mocks.TemplatePdf.mockImplementation(() => pdf);
729+
730+
mocks.validateLetterTemplateFiles.mockReturnValueOnce(true);
731+
732+
await handler(event);
733+
734+
expect(mocks.clientConfigRepository.get).not.toHaveBeenCalled();
735+
736+
expect(
737+
mocks.templateRepository.setLetterValidationResult
738+
).toHaveBeenCalledWith(
739+
{ id: templateId, owner },
740+
versionId,
741+
true,
742+
pdf.personalisationParameters,
743+
[],
744+
false
745+
);
746+
});
747+
686748
test("errors if the template data can't be loaded", async () => {
687749
const { handler, mocks } = setup();
688750

lambdas/backend-api/src/templates/api/validate-letter-template-files.ts

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { logger } from 'nhs-notify-web-template-management-utils/logger';
1+
import {
2+
logger,
3+
type Logger,
4+
} from 'nhs-notify-web-template-management-utils/logger';
25
import {
36
guardDutyEventValidator,
47
isRightToLeft,
@@ -66,19 +69,18 @@ export class ValidateLetterTemplateFilesLambda {
6669
'version-id': versionId,
6770
} = metadata;
6871

69-
const getTemplateResult = await this.templateRepository.get(templateId, {
70-
userId: owner,
71-
clientId: owner,
72-
});
72+
const { error: getTemplateError, data: template } =
73+
await this.templateRepository.get(templateId, {
74+
userId: owner,
75+
clientId: owner,
76+
});
7377

74-
if (getTemplateResult.error) {
75-
log.error('Unable to load template data', getTemplateResult.error);
78+
if (getTemplateError) {
79+
log.error('Unable to load template data', getTemplateError);
7680

7781
throw new Error('Unable to load template data');
7882
}
7983

80-
const template = getTemplateResult.data;
81-
8284
if (!template.files) {
8385
log.error("Can't process non-letter template");
8486
return;
@@ -154,23 +156,13 @@ export class ValidateLetterTemplateFilesLambda {
154156
}
155157

156158
const pdf = new TemplatePdf({ id: templateId, owner }, pdfBuff);
157-
let csv;
158159

159-
const clientConfigurationResult = await this.clientConfigRepository.get(
160-
String(getTemplateResult.data.clientId)
160+
const clientProofingEnabled = await this.isProofingEnabled(
161+
template.clientId,
162+
log
161163
);
162164

163-
if (clientConfigurationResult.error) {
164-
log.error(
165-
'Unable to fetch client configuration',
166-
clientConfigurationResult.error
167-
);
168-
169-
throw new Error('Unable to fetch client configuration');
170-
}
171-
172-
const clientProofingEnabled =
173-
clientConfigurationResult.data?.features?.proofing || false;
165+
let csv;
174166

175167
try {
176168
await pdf.parse();
@@ -184,7 +176,7 @@ export class ValidateLetterTemplateFilesLambda {
184176
log.error('File parsing error:', error);
185177

186178
await this.templateRepository.setLetterValidationResult(
187-
{ id: templateId, owner: getTemplateResult.data.owner },
179+
{ id: templateId, owner: template.owner },
188180
versionId,
189181
false,
190182
[],
@@ -199,12 +191,26 @@ export class ValidateLetterTemplateFilesLambda {
199191
const valid = rtl || validateLetterTemplateFiles(pdf, csv);
200192

201193
await this.templateRepository.setLetterValidationResult(
202-
{ id: templateId, owner: getTemplateResult.data.owner },
194+
{ id: templateId, owner: template.owner },
203195
versionId,
204196
valid,
205197
pdf.personalisationParameters,
206198
csv?.parameters || [],
207199
clientProofingEnabled
208200
);
209201
};
202+
203+
private async isProofingEnabled(clientId: string | undefined, log: Logger) {
204+
const { data: clientConfiguration, error: clientConfigError } = clientId
205+
? await this.clientConfigRepository.get(clientId)
206+
: { data: null };
207+
208+
if (clientConfigError) {
209+
log.error('Unable to fetch client configuration', clientConfigError);
210+
211+
throw new Error('Unable to fetch client configuration');
212+
}
213+
214+
return clientConfiguration?.features?.proofing || false;
215+
}
210216
}

lambdas/backend-api/src/templates/domain/validate-letter-template-files.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,22 @@ export function validateLetterTemplateFiles(
3535
);
3636
}
3737

38-
const valid =
39-
correctAddressLength &&
40-
correctAddressLines &&
41-
customParametersSensiblyFormatted &&
42-
testFileHasExpectedNumberOfParameters &&
43-
allCustomPersonalisationIsInTestFile;
38+
const failedTests = Object.entries({
39+
correctAddressLength,
40+
correctAddressLines,
41+
customParametersSensiblyFormatted,
42+
requiredTestFileExists,
43+
testFileHasExpectedNumberOfParameters,
44+
allCustomPersonalisationIsInTestFile,
45+
}).flatMap(([test, passed]) => (passed ? [] : [test]));
46+
47+
const valid = failedTests.length === 0;
4448

4549
logger.info('Template file validation complete', {
4650
templateId: pdf.templateId,
4751
owner: pdf.owner,
4852
valid,
49-
...(!valid && {
50-
checks: {
51-
correctAddressLength,
52-
correctAddressLines,
53-
customParametersSensiblyFormatted,
54-
requiredTestFileExists,
55-
testFileHasExpectedNumberOfParameters,
56-
allCustomPersonalisationIsInTestFile,
57-
},
58-
}),
53+
failedTests,
5954
});
6055

6156
return valid;

0 commit comments

Comments
 (0)