Skip to content

Commit 01efc4a

Browse files
committed
CCM-12327: virus scan updates lock increment
1 parent 1fda847 commit 01efc4a

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

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

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,15 +1067,7 @@ describe('templateRepository', () => {
10671067
Item,
10681068
});
10691069

1070-
mocks.ddbDocClient
1071-
.on(QueryCommand)
1072-
.resolves({
1073-
Items: [
1074-
{ id: 'abc-def-ghi-jkl-123', owner: ownerWithClientPrefix },
1075-
],
1076-
})
1077-
.on(UpdateCommand)
1078-
.rejects(error);
1070+
mocks.ddbDocClient.on(UpdateCommand).rejects(error);
10791071

10801072
const response = await templateRepository.updateStatus(
10811073
'abc-def-ghi-jkl-123',
@@ -1100,13 +1092,7 @@ describe('templateRepository', () => {
11001092

11011093
const error = new Error('mocked');
11021094

1103-
mocks.ddbDocClient
1104-
.on(QueryCommand)
1105-
.resolves({
1106-
Items: [{ id: 'abc-def-ghi-jkl-123', owner: ownerWithClientPrefix }],
1107-
})
1108-
.on(UpdateCommand)
1109-
.rejects(error);
1095+
mocks.ddbDocClient.on(UpdateCommand).rejects(error);
11101096

11111097
const response = await templateRepository.updateStatus(
11121098
'abc-def-ghi-jkl-123',
@@ -1142,10 +1128,6 @@ describe('templateRepository', () => {
11421128
};
11431129

11441130
mocks.ddbDocClient
1145-
.on(QueryCommand)
1146-
.resolves({
1147-
Items: [{ id: 'abc-def-ghi-jkl-123', owner: ownerWithClientPrefix }],
1148-
})
11491131
.on(UpdateCommand, {
11501132
TableName: templatesTableName,
11511133
Key: { id: 'abc-def-ghi-jkl-123', owner: ownerWithClientPrefix },
@@ -1165,6 +1147,31 @@ describe('templateRepository', () => {
11651147
expect(response).toEqual({
11661148
data: databaseTemplate,
11671149
});
1150+
1151+
expect(mocks.ddbDocClient).toHaveReceivedCommandWith(UpdateCommand, {
1152+
TableName: 'templates',
1153+
Key: { id: 'abc-def-ghi-jkl-123', owner: 'CLIENT#client-id' },
1154+
ReturnValues: 'ALL_NEW',
1155+
ReturnValuesOnConditionCheckFailure: 'ALL_OLD',
1156+
ExpressionAttributeNames: {
1157+
'#templateStatus': 'templateStatus',
1158+
'#updatedAt': 'updatedAt',
1159+
'#updatedBy': 'updatedBy',
1160+
'#lockNumber': 'lockNumber',
1161+
},
1162+
ExpressionAttributeValues: {
1163+
':deleted': 'DELETED',
1164+
':newStatus': 'PENDING_VALIDATION',
1165+
':submitted': 'SUBMITTED',
1166+
':updatedAt': '2024-12-27T00:00:00.000Z',
1167+
':updatedBy': 'user-id',
1168+
':lockNumberIncrement': 1,
1169+
},
1170+
UpdateExpression:
1171+
'SET #templateStatus = :newStatus, #updatedAt = :updatedAt, #updatedBy = :updatedBy ADD #lockNumber :lockNumberIncrement',
1172+
ConditionExpression:
1173+
'attribute_exists(id) AND NOT #templateStatus IN (:deleted, :submitted)',
1174+
});
11681175
});
11691176
});
11701177

@@ -1413,7 +1420,7 @@ describe('templateRepository', () => {
14131420
TableName: 'templates',
14141421
Key: { id: 'template-id', owner: ownerWithClientPrefix },
14151422
UpdateExpression:
1416-
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt',
1423+
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
14171424
ConditionExpression:
14181425
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
14191426
ExpressionAttributeNames: {
@@ -1423,13 +1430,15 @@ describe('templateRepository', () => {
14231430
'#templateStatus': 'templateStatus',
14241431
'#updatedAt': 'updatedAt',
14251432
'#version': 'currentVersion',
1433+
'#lockNumber': 'lockNumber',
14261434
},
14271435
ExpressionAttributeValues: {
14281436
':scanStatus': 'PASSED',
14291437
':templateStatusDeleted': 'DELETED',
14301438
':templateStatusSubmitted': 'SUBMITTED',
14311439
':updatedAt': '2024-12-27T00:00:00.000Z',
14321440
':version': 'pdf-version-id',
1441+
':lockNumberIncrement': 1,
14331442
},
14341443
});
14351444
});
@@ -1448,7 +1457,7 @@ describe('templateRepository', () => {
14481457
TableName: 'templates',
14491458
Key: { id: 'template-id', owner: ownerWithClientPrefix },
14501459
UpdateExpression:
1451-
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt',
1460+
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
14521461
ConditionExpression:
14531462
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
14541463
ExpressionAttributeNames: {
@@ -1458,13 +1467,15 @@ describe('templateRepository', () => {
14581467
'#templateStatus': 'templateStatus',
14591468
'#updatedAt': 'updatedAt',
14601469
'#version': 'currentVersion',
1470+
'#lockNumber': 'lockNumber',
14611471
},
14621472
ExpressionAttributeValues: {
14631473
':scanStatus': 'PASSED',
14641474
':templateStatusDeleted': 'DELETED',
14651475
':templateStatusSubmitted': 'SUBMITTED',
14661476
':updatedAt': '2024-12-27T00:00:00.000Z',
14671477
':version': 'csv-version-id',
1478+
':lockNumberIncrement': 1,
14681479
},
14691480
});
14701481
});
@@ -1483,7 +1494,7 @@ describe('templateRepository', () => {
14831494
TableName: 'templates',
14841495
Key: { id: 'template-id', owner: ownerWithClientPrefix },
14851496
UpdateExpression:
1486-
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt , #templateStatus = :templateStatusFailed',
1497+
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt , #templateStatus = :templateStatusFailed ADD #lockNumber :lockNumberIncrement',
14871498
ConditionExpression:
14881499
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
14891500
ExpressionAttributeNames: {
@@ -1493,6 +1504,7 @@ describe('templateRepository', () => {
14931504
'#templateStatus': 'templateStatus',
14941505
'#updatedAt': 'updatedAt',
14951506
'#version': 'currentVersion',
1507+
'#lockNumber': 'lockNumber',
14961508
},
14971509
ExpressionAttributeValues: {
14981510
':scanStatus': 'FAILED',
@@ -1501,6 +1513,7 @@ describe('templateRepository', () => {
15011513
':templateStatusSubmitted': 'SUBMITTED',
15021514
':updatedAt': '2024-12-27T00:00:00.000Z',
15031515
':version': 'pdf-version-id',
1516+
':lockNumberIncrement': 1,
15041517
},
15051518
});
15061519
});
@@ -1519,7 +1532,7 @@ describe('templateRepository', () => {
15191532
TableName: 'templates',
15201533
Key: { id: 'template-id', owner: ownerWithClientPrefix },
15211534
UpdateExpression:
1522-
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt , #templateStatus = :templateStatusFailed',
1535+
'SET #files.#file.#scanStatus = :scanStatus , #updatedAt = :updatedAt , #templateStatus = :templateStatusFailed ADD #lockNumber :lockNumberIncrement',
15231536
ConditionExpression:
15241537
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
15251538
ExpressionAttributeNames: {
@@ -1529,6 +1542,7 @@ describe('templateRepository', () => {
15291542
'#templateStatus': 'templateStatus',
15301543
'#updatedAt': 'updatedAt',
15311544
'#version': 'currentVersion',
1545+
'#lockNumber': 'lockNumber',
15321546
},
15331547
ExpressionAttributeValues: {
15341548
':scanStatus': 'FAILED',
@@ -1537,6 +1551,7 @@ describe('templateRepository', () => {
15371551
':templateStatusSubmitted': 'SUBMITTED',
15381552
':updatedAt': '2024-12-27T00:00:00.000Z',
15391553
':version': 'csv-version-id',
1554+
':lockNumberIncrement': 1,
15401555
},
15411556
});
15421557
});
@@ -1598,7 +1613,7 @@ describe('templateRepository', () => {
15981613
TableName: 'templates',
15991614
Key: { id: 'template-id', owner: ownerWithClientPrefix },
16001615
UpdateExpression:
1601-
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt , #personalisationParameters = :personalisationParameters , #testDataCsvHeaders = :testDataCsvHeaders',
1616+
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt , #personalisationParameters = :personalisationParameters , #testDataCsvHeaders = :testDataCsvHeaders ADD #lockNumber :lockNumberIncrement',
16021617
ConditionExpression:
16031618
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
16041619
ExpressionAttributeNames: {
@@ -1609,6 +1624,7 @@ describe('templateRepository', () => {
16091624
'#templateStatus': 'templateStatus',
16101625
'#updatedAt': 'updatedAt',
16111626
'#version': 'currentVersion',
1627+
'#lockNumber': 'lockNumber',
16121628
},
16131629
ExpressionAttributeValues: {
16141630
':testDataCsvHeaders': ['csv', 'headers'],
@@ -1618,6 +1634,7 @@ describe('templateRepository', () => {
16181634
':templateStatusSubmitted': 'SUBMITTED',
16191635
':updatedAt': '2024-12-27T00:00:00.000Z',
16201636
':version': 'file-version-id',
1637+
':lockNumberIncrement': 1,
16211638
},
16221639
});
16231640
});
@@ -1636,7 +1653,7 @@ describe('templateRepository', () => {
16361653
TableName: 'templates',
16371654
Key: { id: 'template-id', owner: ownerWithClientPrefix },
16381655
UpdateExpression:
1639-
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt',
1656+
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
16401657
ConditionExpression:
16411658
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
16421659
ExpressionAttributeNames: {
@@ -1645,13 +1662,15 @@ describe('templateRepository', () => {
16451662
'#templateStatus': 'templateStatus',
16461663
'#updatedAt': 'updatedAt',
16471664
'#version': 'currentVersion',
1665+
'#lockNumber': 'lockNumber',
16481666
},
16491667
ExpressionAttributeValues: {
16501668
':templateStatus': 'VALIDATION_FAILED',
16511669
':templateStatusDeleted': 'DELETED',
16521670
':templateStatusSubmitted': 'SUBMITTED',
16531671
':updatedAt': '2024-12-27T00:00:00.000Z',
16541672
':version': 'file-version-id',
1673+
':lockNumberIncrement': 1,
16551674
},
16561675
});
16571676
});
@@ -1674,7 +1693,7 @@ describe('templateRepository', () => {
16741693
TableName: 'templates',
16751694
Key: { id: 'template-id', owner: ownerWithClientPrefix },
16761695
UpdateExpression:
1677-
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt , #personalisationParameters = :personalisationParameters , #testDataCsvHeaders = :testDataCsvHeaders',
1696+
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt , #personalisationParameters = :personalisationParameters , #testDataCsvHeaders = :testDataCsvHeaders ADD #lockNumber :lockNumberIncrement',
16781697
ConditionExpression:
16791698
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
16801699
ExpressionAttributeNames: {
@@ -1685,6 +1704,7 @@ describe('templateRepository', () => {
16851704
'#templateStatus': 'templateStatus',
16861705
'#updatedAt': 'updatedAt',
16871706
'#version': 'currentVersion',
1707+
'#lockNumber': 'lockNumber',
16881708
},
16891709
ExpressionAttributeValues: {
16901710
':testDataCsvHeaders': ['csv', 'headers'],
@@ -1694,6 +1714,7 @@ describe('templateRepository', () => {
16941714
':templateStatusSubmitted': 'SUBMITTED',
16951715
':updatedAt': '2024-12-27T00:00:00.000Z',
16961716
':version': 'file-version-id',
1717+
':lockNumberIncrement': 1,
16971718
},
16981719
});
16991720
});
@@ -1714,7 +1735,7 @@ describe('templateRepository', () => {
17141735
TableName: 'templates',
17151736
Key: { id: 'template-id', owner: ownerWithClientPrefix },
17161737
UpdateExpression:
1717-
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt',
1738+
'SET #templateStatus = :templateStatus , #updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
17181739
ConditionExpression:
17191740
'#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
17201741
ExpressionAttributeNames: {
@@ -1723,13 +1744,15 @@ describe('templateRepository', () => {
17231744
'#templateStatus': 'templateStatus',
17241745
'#updatedAt': 'updatedAt',
17251746
'#version': 'currentVersion',
1747+
'#lockNumber': 'lockNumber',
17261748
},
17271749
ExpressionAttributeValues: {
17281750
':templateStatus': 'VALIDATION_FAILED',
17291751
':templateStatusDeleted': 'DELETED',
17301752
':templateStatusSubmitted': 'SUBMITTED',
17311753
':updatedAt': '2024-12-27T00:00:00.000Z',
17321754
':version': 'file-version-id',
1755+
':lockNumberIncrement': 1,
17331756
},
17341757
});
17351758
});

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ export class TemplateRepository {
329329
'#templateStatus': 'templateStatus',
330330
'#updatedAt': 'updatedAt',
331331
'#version': 'currentVersion',
332+
'#lockNumber': 'lockNumber',
332333
};
333334

334335
const resolvedPostValidationSuccessStatus = proofingEnabled
@@ -344,6 +345,7 @@ export class TemplateRepository {
344345
':templateStatusSubmitted': 'SUBMITTED' satisfies TemplateStatus,
345346
':updatedAt': new Date().toISOString(),
346347
':version': versionId,
348+
':lockNumberIncrement': 1,
347349
};
348350

349351
const updates = [
@@ -371,7 +373,7 @@ export class TemplateRepository {
371373
new UpdateCommand({
372374
TableName: this.templatesTableName,
373375
Key: this.toDatabaseKey(templateKey),
374-
UpdateExpression: `SET ${updates.join(' , ')}`,
376+
UpdateExpression: `SET ${updates.join(' , ')} ADD #lockNumber :lockNumberIncrement`,
375377
ExpressionAttributeNames,
376378
ExpressionAttributeValues,
377379
ConditionExpression: `#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)`,
@@ -551,6 +553,7 @@ export class TemplateRepository {
551553
'#templateStatus': 'templateStatus',
552554
'#updatedAt': 'updatedAt',
553555
'#version': 'currentVersion',
556+
'#lockNumber': 'lockNumber',
554557
};
555558

556559
const ExpressionAttributeValues: UpdateCommandInput['ExpressionAttributeValues'] =
@@ -560,6 +563,7 @@ export class TemplateRepository {
560563
':templateStatusSubmitted': 'SUBMITTED' satisfies TemplateStatus,
561564
':version': versionId,
562565
':updatedAt': new Date().toISOString(),
566+
':lockNumberIncrement': 1,
563567
};
564568

565569
if (status === 'FAILED') {
@@ -573,7 +577,7 @@ export class TemplateRepository {
573577
new UpdateCommand({
574578
TableName: this.templatesTableName,
575579
Key: this.toDatabaseKey(templateKey),
576-
UpdateExpression: `SET ${updates.join(' , ')}`,
580+
UpdateExpression: `SET ${updates.join(' , ')} ADD #lockNumber :lockNumberIncrement`,
577581
ExpressionAttributeNames,
578582
ExpressionAttributeValues,
579583
ConditionExpression: `#files.#file.#version = :version and not #templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)`,

0 commit comments

Comments
 (0)