dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
54 lines (53 loc) • 2.5 kB
JavaScript
import { TransactGetCommand } from '@aws-sdk/lib-dynamodb';
import { EntityFormatter } from '../../../entity/actions/format/index.js';
import { DynamoDBToolboxError } from '../../../errors/index.js';
import { parseCapacityOption } from '../../../options/capacity.js';
import { rejectExtraOptions } from '../../../options/rejectExtraOptions.js';
import { $options } from './getTransaction/constants.js';
import { GetTransaction } from './getTransaction/getTransaction.js';
export const formatResponses = (responses, ...transactions) => responses.map(({ Item: item }, index) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const transaction = transactions[index];
const transactionEntity = transaction.entity;
const { attributes } = transaction[$options];
return {
Item: item
? new EntityFormatter(transactionEntity).format(item, attributes ? { attributes } : {})
: undefined
};
});
export const execute = async (..._transactions) => {
const [headTransactionOrOptions = {}, ...tailTransactions] = _transactions;
const transactions = tailTransactions;
let options = {};
if (headTransactionOrOptions instanceof GetTransaction) {
transactions.unshift(headTransactionOrOptions);
}
else {
options = headTransactionOrOptions;
}
const firstTransaction = transactions[0];
if (firstTransaction === undefined) {
throw new DynamoDBToolboxError('actions.incompleteAction', {
message: 'transactGet incomplete: No GetTransaction supplied'
});
}
const { documentClient, capacity, ...documentClientOptions } = options;
const docClient = documentClient !== null && documentClient !== void 0 ? documentClient : firstTransaction.entity.table.getDocumentClient();
const { Responses, ...restResponse } = await docClient.send(new TransactGetCommand(getCommandInput(transactions, { capacity })), documentClientOptions);
if (Responses === undefined) {
return restResponse;
}
return {
...restResponse,
Responses: formatResponses(Responses, ...transactions)
};
};
export const getCommandInput = (transactions, options = {}) => {
const { capacity, ...extraOptions } = options;
rejectExtraOptions(extraOptions);
return {
TransactItems: transactions.map(command => command.params()),
...(capacity !== undefined ? { ReturnConsumedCapacity: parseCapacityOption(capacity) } : {})
};
};