Skip to content

Commit 1fda847

Browse files
committed
CCM-12327: increment lock number in proof handler
1 parent 512c0dc commit 1fda847

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,11 +1188,12 @@ describe('templateRepository', () => {
11881188
TableName: 'templates',
11891189
Key: { id: 'template-id', owner: ownerWithClientPrefix },
11901190
UpdateExpression:
1191-
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt',
1191+
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
11921192
ConditionExpression:
11931193
'attribute_not_exists(files.proofs.#fileName) and not templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
11941194
ExpressionAttributeNames: {
11951195
'#fileName': 'pdf-template.pdf',
1196+
'#lockNumber': 'lockNumber',
11961197
},
11971198
ExpressionAttributeValues: {
11981199
':templateStatusDeleted': 'DELETED',
@@ -1203,18 +1204,23 @@ describe('templateRepository', () => {
12031204
virusScanStatus: 'PASSED',
12041205
supplier: 'MBA',
12051206
},
1207+
':lockNumberIncrement': 1,
12061208
},
12071209
});
12081210

12091211
expect(mocks.ddbDocClient).toHaveReceivedCommandWith(UpdateCommand, {
12101212
TableName: 'templates',
12111213
Key: { id: 'template-id', owner: ownerWithClientPrefix },
12121214
UpdateExpression:
1213-
'SET templateStatus = :templateStatusProofAvailable, updatedAt = :updatedAt',
1215+
'SET templateStatus = :templateStatusProofAvailable, updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
1216+
ExpressionAttributeNames: {
1217+
'#lockNumber': 'lockNumber',
1218+
},
12141219
ExpressionAttributeValues: {
12151220
':templateStatusWaitingForProof': 'WAITING_FOR_PROOF',
12161221
':templateStatusProofAvailable': 'PROOF_AVAILABLE',
12171222
':updatedAt': new Date().toISOString(),
1223+
':lockNumberIncrement': 1,
12181224
},
12191225
ConditionExpression: 'templateStatus = :templateStatusWaitingForProof',
12201226
});
@@ -1239,11 +1245,12 @@ describe('templateRepository', () => {
12391245
TableName: 'templates',
12401246
Key: { id: 'template-id', owner: ownerWithClientPrefix },
12411247
UpdateExpression:
1242-
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt',
1248+
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
12431249
ConditionExpression:
12441250
'attribute_not_exists(files.proofs.#fileName) and not templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
12451251
ExpressionAttributeNames: {
12461252
'#fileName': 'pdf-template.pdf',
1253+
'#lockNumber': 'lockNumber',
12471254
},
12481255
ExpressionAttributeValues: {
12491256
':templateStatusDeleted': 'DELETED',
@@ -1254,6 +1261,7 @@ describe('templateRepository', () => {
12541261
virusScanStatus: 'FAILED',
12551262
supplier: 'MBA',
12561263
},
1264+
':lockNumberIncrement': 1,
12571265
},
12581266
});
12591267

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ export class TemplateClient {
322322
const submitResult = await this.templateRepository.submit(
323323
templateId,
324324
user,
325-
lockNumber
325+
lockNumberValidation.data
326326
);
327327

328328
if (submitResult.error) {

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,12 @@ export class TemplateRepository {
237237
return result;
238238
} catch (error) {
239239
if (error instanceof ConditionalCheckFailedException && error.Item) {
240+
const oldItem = unmarshall(error.Item);
241+
242+
if (oldItem.lockNumber !== lockNumber) {
243+
return failure(ErrorCase.CONFLICT, 'Invalid lock number', error);
244+
}
245+
240246
return failure(
241247
ErrorCase.CANNOT_SUBMIT,
242248
'Template cannot be submitted',
@@ -396,9 +402,10 @@ export class TemplateRepository {
396402
TableName: this.templatesTableName,
397403
Key: this.toDatabaseKey(templateKey),
398404
UpdateExpression:
399-
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt',
405+
'SET files.proofs.#fileName = :virusScanResult, updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
400406
ExpressionAttributeNames: {
401407
'#fileName': fileName,
408+
'#lockNumber': 'lockNumber',
402409
},
403410
ExpressionAttributeValues: {
404411
':templateStatusDeleted': 'DELETED' satisfies TemplateStatus,
@@ -409,6 +416,7 @@ export class TemplateRepository {
409416
virusScanStatus,
410417
supplier,
411418
} satisfies ProofFileDetails,
419+
':lockNumberIncrement': 1,
412420
},
413421
ConditionExpression:
414422
'attribute_not_exists(files.proofs.#fileName) and not templateStatus in (:templateStatusDeleted, :templateStatusSubmitted)',
@@ -425,13 +433,17 @@ export class TemplateRepository {
425433
TableName: this.templatesTableName,
426434
Key: this.toDatabaseKey(templateKey),
427435
UpdateExpression:
428-
'SET templateStatus = :templateStatusProofAvailable, updatedAt = :updatedAt',
436+
'SET templateStatus = :templateStatusProofAvailable, updatedAt = :updatedAt ADD #lockNumber :lockNumberIncrement',
437+
ExpressionAttributeNames: {
438+
'#lockNumber': 'lockNumber',
439+
},
429440
ExpressionAttributeValues: {
430441
':templateStatusWaitingForProof':
431442
'WAITING_FOR_PROOF' satisfies TemplateStatus,
432443
':templateStatusProofAvailable':
433444
'PROOF_AVAILABLE' satisfies TemplateStatus,
434445
':updatedAt': new Date().toISOString(),
446+
':lockNumberIncrement': 1,
435447
},
436448
ConditionExpression: 'templateStatus = :templateStatusWaitingForProof',
437449
})

0 commit comments

Comments
 (0)