nyawach
11/25/2019 - 9:49 AM

TableName 以外の UpdateItem に必要なデータを作成する

import {
  ExpressionAttributeValueMap,
  Key,
  UpdateExpression,
  ExpressionAttributeNameMap,
} from "aws-sdk/clients/dynamodb"
import { reverse } from "@/helper/string"

export interface GenerateUpdateItemInputReturn {
  Key: Key
  ExpressionAttributeValues: ExpressionAttributeValueMap
  ExpressionAttributeNames: ExpressionAttributeNameMap
  UpdateExpression: UpdateExpression
}

/**
 * TableName 以外の UpdateItem に必要なデータを作成する
 *
 * - UpdateExpression → SET #lru = :url, #di = :id
 * - ExpressionAttributeNames → { '#lru': 'url', '#di': 'id' }
 * - ExpressionAttributeValues → { ':url': 'http://example.com', ':id': '239032840' }
 *
 * @param item 更新したいアイテム
 * @param hashKey ハッシュキーに設定しているキー名
 */
export const generateUpdateItemInput = (
  item: any,
  hashKey = "id"
): GenerateUpdateItemInputReturn => {
  const ue: string[] = []
  const ExpressionAttributeNames: ExpressionAttributeNameMap = {}
  let ExpressionAttributeValues: ExpressionAttributeValueMap = {}
  Object.keys(item).forEach(k => {
    const v = item[k]
    if (k === hashKey) return
    const attrKey = `:${k}`
    const ean = `#${reverse(k)}`
    ExpressionAttributeValues[attrKey] = v
    ExpressionAttributeNames[ean] = k
    const expression = `${ean} = ${attrKey}`
    ue.push(expression)
  })
  const UpdateExpression = `SET ${ue.join(", ")}`
  const result: GenerateUpdateItemInputReturn = {
    Key: {
      [hashKey]: item[hashKey],
    },
    ExpressionAttributeNames,
    ExpressionAttributeValues,
    UpdateExpression,
  }
  return result
}