import { DynamoDBExpression } from "../expressions/DynamoDBExpression" import { PartitionAndSortKey } from "../keys" import { TaggedModel } from "../types" import { BaseParams } from "./BaseParams" export interface UpdateItemParams extends BaseParams { key: PartitionAndSortKey keyConditionExpression: string updateExpression: DynamoDBExpression } export interface UpdateItemResult { item: T } export async function updateItem(params: UpdateItemParams): Promise> { const { table, client, key, keyConditionExpression, updateExpression } = params const { expression, attributeNames, attributeValues } = updateExpression const hasValues = Object.keys(attributeValues).length > 0 const result = await client .update({ TableName: table.tableName, ConditionExpression: keyConditionExpression, Key: { [table.partitionKeyName]: key.partitionKey, [table.sortKeyName]: key.sortKey }, UpdateExpression: expression, ExpressionAttributeNames: attributeNames, ExpressionAttributeValues: hasValues ? attributeValues : undefined, ReturnValues: "ALL_NEW" // return item after update applied }) .promise() if (result.Attributes !== undefined) { return { item: result.Attributes as T } } else { throw new Error(`Item pk: ${key.partitionKey}, sk: ${key.sortKey} not found`) } }