in src/dataServices/dynamoDbBundleService.ts [576:629]
private async stageItems(requests: BatchReadWriteRequest[], lockedItems: ItemRequest[], tenantId?: string) {
logger.info('Start Staging of Items');
const idToVersionId: Record<string, number> = {};
lockedItems.forEach((idItemLocked: ItemRequest) => {
idToVersionId[idItemLocked.id] = idItemLocked.vid || 0;
});
const { deleteRequests, createRequests, updateRequests, readRequests, newLocks, newStagingResponses } =
DynamoDbBundleServiceHelper.generateStagingRequests(requests, idToVersionId, tenantId);
// Order that Bundle specifies
// https://www.hl7.org/fhir/http.html#trules
const editRequests: any[] = [...deleteRequests, ...createRequests, ...updateRequests];
const writeParams =
editRequests.length > 0
? {
TransactItems: editRequests,
}
: null;
const readParams =
readRequests.length > 0
? {
TransactItems: readRequests,
}
: null;
let batchReadWriteResponses: BatchReadWriteResponse[] = [];
let allLockedItems: ItemRequest[] = lockedItems;
try {
if (writeParams) {
await this.dynamoDb.transactWriteItems(writeParams).promise();
}
// Keep track of items successfully staged
allLockedItems = lockedItems.concat(newLocks);
batchReadWriteResponses = batchReadWriteResponses.concat(newStagingResponses);
if (readParams) {
const readResult = await this.dynamoDb.transactGetItems(readParams).promise();
batchReadWriteResponses = DynamoDbBundleServiceHelper.populateBundleEntryResponseWithReadResult(
batchReadWriteResponses,
readResult,
);
}
logger.info('Successfully staged items');
return Promise.resolve({ success: true, batchReadWriteResponses, lockedItems: allLockedItems });
} catch (e) {
logger.error('Failed to stage items', e);
return Promise.resolve({ success: false, batchReadWriteResponses, lockedItems: allLockedItems });
}
}