UNPKG

dynamodb-toolbox

Version:

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

61 lines (60 loc) 2.95 kB
import { EntityParser } from '../../../entity/actions/parse/index.js'; import { expressUpdate } from '../../../entity/actions/update/expressUpdate/index.js'; import { parseUpdateExtension } from '../../../entity/actions/update/updateItemParams/extension/index.js'; import { DynamoDBToolboxError } from '../../../errors/index.js'; import { isEmpty } from '../../../utils/isEmpty.js'; import { omit } from '../../../utils/omit.js'; import { WriteTransaction } from '../transactWrite/transaction.js'; import { $item, $options } from './constants.js'; import { parseOptions } from './options.js'; export class UpdateTransaction extends WriteTransaction { constructor(entity, item, options = {}) { super(entity); this[$item] = item; this[$options] = options; } item(nextItem) { return new UpdateTransaction(this.entity, nextItem, this[$options]); } options(nextOptions) { return new UpdateTransaction(this.entity, this[$item], typeof nextOptions === 'function' ? nextOptions(this[$options]) : nextOptions); } params() { var _a; if (!this[$item]) { throw new DynamoDBToolboxError('actions.incompleteAction', { message: 'UpdateTransaction incomplete: Missing "item" property' }); } const { parsedItem, item, key } = this.entity.build(EntityParser).parse(this[$item], { mode: 'update', parseExtension: parseUpdateExtension }); const { ExpressionAttributeNames: updateExpressionAttributeNames, ExpressionAttributeValues: updateExpressionAttributeValues, UpdateExpression } = expressUpdate(this.entity, omit(item, ...Object.keys(key))); const options = this[$options]; const { ExpressionAttributeNames: optionsExpressionAttributeNames, ExpressionAttributeValues: optionsExpressionAttributeValues, ...awsOptions } = parseOptions(this.entity, options); const ExpressionAttributeNames = { ...optionsExpressionAttributeNames, ...updateExpressionAttributeNames }; const ExpressionAttributeValues = { ...optionsExpressionAttributeValues, ...updateExpressionAttributeValues }; return { /** * @debt type "TODO: Rework extensions & not cast here (use `ParsedItem<ENTITY, { extension: UpdateItemExtension }>`)" */ ToolboxItem: parsedItem, Update: { TableName: (_a = options.tableName) !== null && _a !== void 0 ? _a : this.entity.table.getName(), Key: key, UpdateExpression, ...awsOptions, ...(!isEmpty(ExpressionAttributeNames) ? { ExpressionAttributeNames } : {}), ...(!isEmpty(ExpressionAttributeValues) ? { ExpressionAttributeValues } : {}) } }; } } UpdateTransaction.actionName = 'transactUpdate';