Skip to content

Instantly share code, notes, and snippets.

@mtimbs
Last active September 28, 2020 00:37
Show Gist options
  • Save mtimbs/bd057782e78e852f41e7c42c4d23178b to your computer and use it in GitHub Desktop.
Save mtimbs/bd057782e78e852f41e7c42c4d23178b to your computer and use it in GitHub Desktop.
interface DynamoUpdateParams {
UpdateExpression: string;
ExpressionAttributeNames: Record<string, string>;
ExpressionAttributeValues: Record<string, unknown>;
}
export const DynamicUpdateExpressionFromObject = (map: Record<string, unknown>): DynamoUpdateParams => {
const ExpressionAttributeNames: Record<string, string> = Object.keys(map)
.reduce((acc, curr) => ({ ...acc, ...{ [`#${curr}`]: curr } }), {});
const UpdateExpression: string = Object.values(ExpressionAttributeNames)
.reduce((acc, curr) => `${acc} #${curr} = :${curr},`, 'SET').slice(0, -1);
const ExpressionAttributeValues = Object.entries(map)
.reduce((acc, [key, value]) => ({ ...acc, ...{ [`:${key}`]: value } }), {});
return {
UpdateExpression,
ExpressionAttributeNames,
ExpressionAttributeValues,
};
};
@mtimbs
Copy link
Author

mtimbs commented Sep 10, 2020

Example Usage

export const updateItem = async (pk: string, item: Partial<Item>): Promise<void> => {
  const updateParams = DynamicUpdateExpressionFromObject(item);

  await dynamoDBClient.update({
    TableName: process.env.DYNAMODB_TABLE,
    Key: {
      pk,
      sk: `item:${item.id}`,
    },
    ...updateParams,
  }).promise();
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment