UNPKG

dynamodb-toolbox

Version:

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

54 lines (53 loc) 2.5 kB
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) } : {}) }; };