Skip to content

Commit 114b175

Browse files
committed
CCM-9692: add primary status condition
1 parent d8fbbf3 commit 114b175

File tree

12 files changed

+73
-61
lines changed

12 files changed

+73
-61
lines changed

frontend/src/__tests__/utils/form-actions.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ describe('form-actions', () => {
491491
const responseData = {
492492
id: 'id',
493493
templateType: 'NHS_APP',
494-
templateStatus: 'NOT_YET_SUBMITTED',
494+
templateStatus: 'SUBMITTED',
495495
name: 'name',
496496
message: 'message',
497497
createdAt: '2025-01-13T10:19:25.579Z',

infrastructure/terraform/modules/backend-api/spec.tmpl.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,8 @@
505505
"SUBMITTED",
506506
"DELETED",
507507
"PENDING_UPLOAD",
508-
"PENDING_VALIDATION"
508+
"PENDING_VALIDATION",
509+
"VIRUS_SCAN_FAILED"
509510
]
510511
},
511512
"Language": {

lambdas/backend-api/src/__tests__/templates/infra/template-repository.test.ts

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -501,39 +501,55 @@ describe('templateRepository', () => {
501501
},
502502
{
503503
testName:
504-
'Fails when user tries to update template when templateStatus is SUBMITTED',
505-
Item: {
506-
templateType: { S: 'EMAIL' },
507-
templateStatus: { S: 'SUBMITTED' },
508-
},
504+
'Fails when user tries to submit template when templateStatus is SUBMITTED',
505+
Item: marshall({
506+
templateType: 'EMAIL',
507+
templateStatus: 'SUBMITTED',
508+
}),
509509
code: 400,
510510
message: 'Template with status SUBMITTED cannot be updated',
511511
},
512512
{
513513
testName:
514-
'Fails when user tries to update template when templateStatus is DELETED',
515-
Item: {
516-
templateType: { S: 'EMAIL' },
517-
templateStatus: { S: 'DELETED' },
518-
},
514+
'Fails when user tries to submit template when templateStatus is not NOT_YET_SUBMITTED',
515+
Item: marshall({
516+
templateType: 'LETTER',
517+
templateStatus: 'PENDING_UPLOAD',
518+
}),
519+
code: 400,
520+
message: 'Template cannot be submitted',
521+
},
522+
{
523+
testName:
524+
'Fails when user tries to submit template when templateStatus is DELETED',
525+
Item: marshall({
526+
templateType: 'EMAIL',
527+
templateStatus: 'DELETED',
528+
}),
519529
code: 404,
520530
message: 'Template not found',
521531
},
522532
{
523533
testName:
524-
'Fails when user tries to update a letter template when any virusScanStatus is NOT PASSED',
525-
Item: {
526-
templateType: { S: 'LETTER' },
527-
templateStatus: { S: 'NOT_YET_SUBMITTED' },
528-
...marshall({
529-
files: {
530-
pdfTemplate: { virusScanStatus: 'PASSED' },
531-
testDataCsv: { virusScanStatus: 'FAILED' },
534+
'Fails when user tries to submit a letter template when any virusScanStatus is not PASSED',
535+
Item: marshall({
536+
templateType: 'LETTER',
537+
templateStatus: 'NOT_YET_SUBMITTED',
538+
files: {
539+
pdfTemplate: {
540+
virusScanStatus: 'PASSED',
541+
currentVersion: 'a',
542+
fileName: 'pdf.pdf',
532543
},
533-
}),
534-
},
544+
testDataCsv: {
545+
virusScanStatus: 'FAILED',
546+
currentVersion: 'a',
547+
fileName: 'csv.csv',
548+
},
549+
},
550+
}),
535551
code: 400,
536-
message: 'Virus scan not complete cannot submit template.',
552+
message: 'Template cannot be submitted',
537553
},
538554
])(
539555
'should return error when, ConditionalCheckFailedException occurs and no Item is returned %p',

lambdas/backend-api/src/templates/infra/template-repository.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
} from '@aws-sdk/lib-dynamodb';
2424
import { ApplicationResult, failure, success, calculateTTL } from '../../utils';
2525
import { DatabaseTemplate } from './template';
26-
import { unmarshall } from '@aws-sdk/util-dynamodb';
2726

2827
type WithAttachments<T> = T extends { templateType: 'LETTER' }
2928
? T & { files: LetterFiles }
@@ -209,12 +208,14 @@ export class TemplateRepository {
209208

210209
const expressionAttributeValues: Record<string, string> = {
211210
':newStatus': 'SUBMITTED' satisfies TemplateStatus,
211+
':expectedStatus': 'NOT_YET_SUBMITTED' satisfies TemplateStatus,
212212
':passed': 'PASSED' satisfies VirusScanStatus,
213213
};
214214

215215
const conditions = [
216216
'(attribute_not_exists(files.pdfTemplate) OR files.pdfTemplate.virusScanStatus = :passed)',
217217
'(attribute_not_exists(files.testDataCsv) OR files.testDataCsv.virusScanStatus = :passed)',
218+
'#templateStatus = :notYetSubmitted',
218219
];
219220

220221
try {
@@ -230,20 +231,11 @@ export class TemplateRepository {
230231
return result;
231232
} catch (error) {
232233
if (error instanceof ConditionalCheckFailedException && error.Item) {
233-
const template = unmarshall(error.Item);
234-
235-
const virusScanStatuses = [
236-
String(template?.files?.pdfTemplate?.virusScanStatus),
237-
String(template?.files?.testDataCsv?.virusScanStatus),
238-
];
239-
240-
if (virusScanStatuses.some((status) => status !== 'PASSED')) {
241-
return failure(
242-
ErrorCase.VIRUS_SCAN_NOT_COMPLETE,
243-
'Virus scan not complete cannot submit template.',
244-
error
245-
);
246-
}
234+
return failure(
235+
ErrorCase.CANNOT_SUBMIT,
236+
'Template cannot be submitted',
237+
error
238+
);
247239
}
248240

249241
return failure(ErrorCase.IO_FAILURE, 'Failed to update template', error);

lambdas/backend-client/src/schemas/union-lists.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const TEMPLATE_STATUS_LIST = arrayOfAll<TemplateStatus>()([
4141
'DELETED',
4242
'PENDING_UPLOAD',
4343
'PENDING_VALIDATION',
44+
'VIRUS_SCAN_FAILED',
4445
]);
4546

4647
export const LANGUAGE_LIST = arrayOfAll<Language>()([

lambdas/backend-client/src/types/error-cases.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ export enum ErrorCase {
66
IO_FAILURE = 500,
77
TEMPLATE_ALREADY_SUBMITTED = 400,
88
CANNOT_CHANGE_TEMPLATE_TYPE = 400,
9-
VIRUS_SCAN_NOT_COMPLETE = 400,
9+
CANNOT_SUBMIT = 400,
1010
}

lambdas/backend-client/src/types/generated/types.gen.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ export type TemplateStatus =
77
| 'SUBMITTED'
88
| 'DELETED'
99
| 'PENDING_UPLOAD'
10-
| 'PENDING_VALIDATION';
10+
| 'PENDING_VALIDATION'
11+
| 'VIRUS_SCAN_FAILED';
1112

1213
export type Language =
1314
| 'ar'

tests/test-team/helpers/use-cases/simulate-failed-virus-scan.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Template } from '../types';
66
type Config = {
77
templateId: string;
88
templateOwner: string;
9-
path:
9+
filePath:
1010
| 'files.pdfTemplate.virusScanStatus'
1111
| 'files.testDataCsv.virusScanStatus';
1212
};
@@ -29,9 +29,10 @@ export class SimulateFailedVirusScan implements IUseCase<Template> {
2929
owner: this.#config.templateOwner,
3030
id: this.#config.templateId,
3131
},
32-
UpdateExpression: `SET ${this.#config.path} = :virusScanStatus`,
32+
UpdateExpression: `SET ${this.#config.filePath} = :virusScanStatus, templateStatus = :virusScanStatusFailedTemplateStatus`,
3333
ExpressionAttributeValues: {
3434
':virusScanStatus': 'FAILED',
35+
':virusScanStatusFailedTemplateStatus': 'VIRUS_SCAN_FAILED',
3536
},
3637
ReturnValues: 'ALL_NEW',
3738
})

tests/test-team/helpers/use-cases/simulate-passed-virus-scan.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type Config = {
88
templateOwner: string;
99
};
1010

11-
export class SimulatePassedVirusScan implements IUseCase<Template> {
11+
export class SimulatePassedValidation implements IUseCase<Template> {
1212
readonly #ddbDocClient: DynamoDBDocumentClient;
1313
readonly #config: Config;
1414

@@ -26,9 +26,14 @@ export class SimulatePassedVirusScan implements IUseCase<Template> {
2626
owner: this.#config.templateOwner,
2727
id: this.#config.templateId,
2828
},
29-
UpdateExpression: `SET files.pdfTemplate.virusScanStatus = :virusScanStatus, files.testDataCsv.virusScanStatus = :virusScanStatus`,
29+
UpdateExpression: [
30+
'SET files.pdfTemplate.virusScanStatus = :virusScanStatus',
31+
'files.testDataCsv.virusScanStatus = :virusScanStatus',
32+
'templateStatus = :readyForSubmissionStatus',
33+
].join(', '),
3034
ExpressionAttributeValues: {
3135
':virusScanStatus': 'PASSED',
36+
':readyForSubmissionStatus': 'NOT_YET_SYBMITTED',
3237
},
3338
ReturnValues: 'ALL_NEW',
3439
})

tests/test-team/template-mgmt-api-tests/delete-template.api.spec.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { TemplateAPIPayloadFactory } from '../helpers/factories/template-api-pay
99
import { pdfUploadFixtures } from '../fixtures/pdf-upload/multipart-pdf-letter-fixtures';
1010
import {
1111
UseCaseOrchestrator,
12-
SimulatePassedVirusScan,
12+
SimulatePassedValidation,
1313
} from '../helpers/use-cases';
1414

1515
test.describe('DELETE /v1/template/:templateId', () => {
@@ -143,13 +143,6 @@ test.describe('DELETE /v1/template/:templateId', () => {
143143

144144
expect(response.status(), debug).toBe(201);
145145

146-
await orchestrator.send(
147-
new SimulatePassedVirusScan({
148-
templateId: createResult.template.id,
149-
templateOwner: user1.userId,
150-
})
151-
);
152-
153146
const deleteResponse = await request.delete(
154147
`${process.env.API_BASE_URL}/v1/template/${createResult.template.id}`,
155148
{
@@ -215,7 +208,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
215208
expect(response.status(), debug).toBe(201);
216209

217210
await orchestrator.send(
218-
new SimulatePassedVirusScan({
211+
new SimulatePassedValidation({
219212
templateId: createResult.template.id,
220213
templateOwner: user1.userId,
221214
})

0 commit comments

Comments
 (0)