in src/dataServices/dynamoDbBundleServiceHelper.ts [27:161]
static generateStagingRequests(
requests: BatchReadWriteRequest[],
idToVersionId: Record<string, number>,
tenantId?: string,
) {
const deleteRequests: any = [];
const createRequests: any = [];
const updateRequests: any = [];
const readRequests: any = [];
let newLocks: ItemRequest[] = [];
let newBundleEntryResponses: BatchReadWriteResponse[] = [];
requests.forEach((request) => {
switch (request.operation) {
case 'create': {
// Add create request, put it in PENDING
let id = uuidv4();
if (request.id) {
id = request.id;
}
const vid = 1;
const Item = DynamoDbUtil.prepItemForDdbInsert(
request.resource,
id,
vid,
DOCUMENT_STATUS.PENDING,
tenantId,
);
createRequests.push({
Put: {
TableName: RESOURCE_TABLE,
Item: DynamoDBConverter.marshall(Item),
},
});
const { stagingResponse, itemLocked } = this.addStagingResponseAndItemsLocked(request.operation, {
...request.resource,
meta: { ...Item.meta },
id,
});
newBundleEntryResponses = newBundleEntryResponses.concat(stagingResponse);
newLocks = newLocks.concat(itemLocked);
break;
}
case 'update': {
// Create new entry with status = PENDING
// When updating a resource, create a new Document for that resource
const { id } = request.resource;
const vid = (idToVersionId[id] || 0) + 1;
const Item = DynamoDbUtil.prepItemForDdbInsert(
request.resource,
id,
vid,
DOCUMENT_STATUS.PENDING,
tenantId,
);
updateRequests.push({
Put: {
TableName: RESOURCE_TABLE,
Item: DynamoDBConverter.marshall(Item),
},
});
const { stagingResponse, itemLocked } = this.addStagingResponseAndItemsLocked(request.operation, {
...request.resource,
meta: { ...Item.meta },
});
newBundleEntryResponses = newBundleEntryResponses.concat(stagingResponse);
newLocks = newLocks.concat(itemLocked);
break;
}
case 'delete': {
// Mark documentStatus as PENDING_DELETE
const { id, resourceType } = request;
const vid = idToVersionId[id];
deleteRequests.push(
DynamoDbParamBuilder.buildUpdateDocumentStatusParam(
DOCUMENT_STATUS.LOCKED,
DOCUMENT_STATUS.PENDING_DELETE,
id,
vid,
resourceType,
tenantId,
),
);
newBundleEntryResponses.push({
id,
vid: vid.toString(),
operation: request.operation,
lastModified: new Date().toISOString(),
resource: {},
resourceType: request.resourceType,
});
break;
}
case 'read': {
// Read the latest version with documentStatus = "LOCKED"
const { id } = request;
const vid = idToVersionId[id];
readRequests.push({
Get: {
TableName: RESOURCE_TABLE,
Key: DynamoDBConverter.marshall({
id: buildHashKey(id, tenantId),
vid,
}),
},
});
newBundleEntryResponses.push({
id,
vid: vid.toString(),
operation: request.operation,
lastModified: '',
resource: {},
resourceType: request.resourceType,
});
break;
}
default: {
break;
}
}
});
return {
deleteRequests,
createRequests,
updateRequests,
readRequests,
newLocks,
newStagingResponses: newBundleEntryResponses,
};
}