UNPKG

dynamodb-toolbox

Version:

Lightweight and type-safe query builder for DynamoDB and TypeScript.

59 lines (58 loc) 2.7 kB
import { TransactWriteCommand } from '@aws-sdk/lib-dynamodb'; import { DynamoDBToolboxError } from '../../../errors/index.js'; import { parseCapacityOption } from '../../../options/capacity.js'; import { parseClientRequestToken } from '../../../options/clientRequestToken.js'; import { parseMetricsOption } from '../../../options/metrics.js'; import { rejectExtraOptions } from '../../../options/rejectExtraOptions.js'; import { isWriteTransactionImplementation } from './transaction.js'; export const execute = async (..._transactions) => { const [headTransactionOrOptions = {}, ...tailTransactions] = _transactions; const transactions = tailTransactions; let options = {}; if (isWriteTransactionImplementation(headTransactionOrOptions)) { transactions.unshift(headTransactionOrOptions); } else { options = headTransactionOrOptions; } const firstTransaction = transactions[0]; if (firstTransaction === undefined) { throw new DynamoDBToolboxError('actions.incompleteAction', { message: 'Cannot execute WriteTransactions: No transaction supplied' }); } const { documentClient, capacity, metrics, clientRequestToken, ...documentClientOptions } = options; const docClient = documentClient !== null && documentClient !== void 0 ? documentClient : firstTransaction.entity.table.getDocumentClient(); const { TransactItems = [], ...restCommandInput } = getCommandInput(transactions, { capacity, metrics, clientRequestToken }); const toolboxItems = []; for (const transactItem of TransactItems) { const { ToolboxItem } = transactItem; toolboxItems.push(ToolboxItem); delete transactItem.ToolboxItem; } const response = await docClient.send(new TransactWriteCommand({ TransactItems, ...restCommandInput }), documentClientOptions); return { ToolboxItems: toolboxItems, ...response }; }; const parseOptions = (options) => { const commandOptions = {}; const { clientRequestToken, capacity, metrics, ...extraOptions } = options; rejectExtraOptions(extraOptions); if (clientRequestToken !== undefined) { commandOptions.ClientRequestToken = parseClientRequestToken(clientRequestToken); } if (capacity !== undefined) { commandOptions.ReturnConsumedCapacity = parseCapacityOption(capacity); } if (metrics !== undefined) { commandOptions.ReturnItemCollectionMetrics = parseMetricsOption(metrics); } return commandOptions; }; export const getCommandInput = (transactions, options = {}) => ({ ...parseOptions(options), TransactItems: transactions.map(command => command.params()) });