dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
61 lines (60 loc) • 2.95 kB
JavaScript
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';