in src/dataServices/dynamoDbParamBuilder.ts [22:68]
static buildUpdateDocumentStatusParam(
oldStatus: DOCUMENT_STATUS | null,
newStatus: DOCUMENT_STATUS,
id: string,
vid: number,
resourceType: string,
tenantId?: string,
) {
const currentTs = Date.now();
let futureEndTs = currentTs;
if (newStatus === DOCUMENT_STATUS.LOCKED) {
futureEndTs = currentTs + this.LOCK_DURATION_IN_MS;
}
const params: any = {
Update: {
TableName: RESOURCE_TABLE,
Key: DynamoDBConverter.marshall({
id: buildHashKey(id, tenantId),
vid,
}),
UpdateExpression: `set ${DOCUMENT_STATUS_FIELD} = :newStatus, ${LOCK_END_TS_FIELD} = :futureEndTs`,
ExpressionAttributeValues: DynamoDBConverter.marshall({
':newStatus': newStatus,
':futureEndTs': futureEndTs,
':resourceType': resourceType,
}),
ConditionExpression: `resourceType = :resourceType`,
},
};
if (oldStatus) {
params.Update.ConditionExpression = `resourceType = :resourceType AND (${DOCUMENT_STATUS_FIELD} = :oldStatus OR (${LOCK_END_TS_FIELD} < :currentTs AND (${DOCUMENT_STATUS_FIELD} = :lockStatus OR ${DOCUMENT_STATUS_FIELD} = :pendingStatus OR ${DOCUMENT_STATUS_FIELD} = :pendingDeleteStatus)))`;
params.Update.ExpressionAttributeValues = DynamoDBConverter.marshall({
':newStatus': newStatus,
':oldStatus': oldStatus,
':lockStatus': DOCUMENT_STATUS.LOCKED,
':pendingStatus': DOCUMENT_STATUS.PENDING,
':pendingDeleteStatus': DOCUMENT_STATUS.PENDING_DELETE,
':currentTs': currentTs,
':futureEndTs': futureEndTs,
':resourceType': resourceType,
});
}
return params;
}