UNPKG

dynamodb-toolbox

Version:

Lightweight and type-safe query builder for DynamoDB and TypeScript.

103 lines (102 loc) 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.expressUpdate = void 0; const path_js_1 = require("../../../../schema/actions/utils/path.js"); const isArray_js_1 = require("../../../../utils/validation/isArray.js"); const isObject_js_1 = require("../../../../utils/validation/isObject.js"); const index_js_1 = require("../symbols/index.js"); const add_js_1 = require("./updates/add.js"); const append_js_1 = require("./updates/append.js"); const delete_js_1 = require("./updates/delete.js"); const get_js_1 = require("./updates/get.js"); const prepend_js_1 = require("./updates/prepend.js"); const remove_js_1 = require("./updates/remove.js"); const set_js_1 = require("./updates/set.js"); const subtract_js_1 = require("./updates/subtract.js"); const sum_js_1 = require("./updates/sum.js"); const utils_js_1 = require("./updates/utils.js"); const expressUpdate = (entity, input) => { const { setExpressions, removeExpressions, addExpressions, deleteExpressions, ExpressionAttributeNames, ExpressionAttributeValues } = expressUpdateRec(input, new path_js_1.Path(), { rootSchema: entity.schema, setExpressions: [], removeExpressions: [], addExpressions: [], deleteExpressions: [], nameCursors: { s: 1, r: 1, a: 1, d: 1 }, valueCursors: { s: 1, r: 1, a: 1, d: 1 }, tokens: { s: {}, r: {}, a: {}, d: {} }, ExpressionAttributeNames: {}, ExpressionAttributeValues: {} }); const updateExpressions = []; if (setExpressions.length > 0) { updateExpressions.push(`SET ${setExpressions.join(', ')}`); } if (removeExpressions.length > 0) { updateExpressions.push(`REMOVE ${removeExpressions.join(', ')}`); } if (addExpressions.length > 0) { updateExpressions.push(`ADD ${addExpressions.join(', ')}`); } if (deleteExpressions.length > 0) { updateExpressions.push(`DELETE ${deleteExpressions.join(', ')}`); } return { UpdateExpression: updateExpressions.join(' '), ExpressionAttributeNames, ExpressionAttributeValues }; }; exports.expressUpdate = expressUpdate; const expressUpdateRec = (value, path, state) => { if (value === undefined) { return state; } if ((0, index_js_1.isSetting)(value)) { return (0, set_js_1.expressSetUpdate)(value, path, state); } if ((0, index_js_1.isGetting)(value)) { return (0, get_js_1.expressGetUpdate)(value, path, state); } if ((0, index_js_1.isSum)(value)) { return (0, sum_js_1.expressSumUpdate)(value, path, state); } if ((0, index_js_1.isSubtraction)(value)) { return (0, subtract_js_1.expressSubtractUpdate)(value, path, state); } if ((0, index_js_1.isAppending)(value)) { return (0, append_js_1.expressAppendUpdate)(value, path, state); } if ((0, index_js_1.isPrepending)(value)) { return (0, prepend_js_1.expressPrependUpdate)(value, path, state); } if ((0, index_js_1.isRemoval)(value)) { return (0, remove_js_1.expressRemoveUpdate)(value, path, state); } if ((0, index_js_1.isAddition)(value)) { return (0, add_js_1.expressAddUpdate)(value, path, state); } if ((0, index_js_1.isDeletion)(value)) { return (0, delete_js_1.expressDeleteUpdate)(value, path, state); } if ((0, isObject_js_1.isObject)(value)) { for (const [attrName, attrValue] of Object.entries(value)) { expressUpdateRec(attrValue, path.append(attrName), state); } return state; } if ((0, isArray_js_1.isArray)(value)) { value.forEach((element, index) => { if (element === undefined) { return; } expressUpdateRec(element, path.append(index), state); }); return state; } let setExpression = (0, utils_js_1.pathTokens)(path, 's', state); setExpression += ' = '; setExpression += (0, utils_js_1.refOrValueTokens)(value, 's', state); state.setExpressions.push(setExpression); return state; };