private async stageItems()

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 });
        }
    }