dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
59 lines (58 loc) • 2.7 kB
JavaScript
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())
});