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
}