dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
103 lines (102 loc) • 4.12 kB
JavaScript
"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;
};