UNPKG

sails-arangojs

Version:

A sails-arangojs adapter for Sails / Waterline

171 lines (157 loc) 4.57 kB
const _ = require('@sailshq/lodash'); const SqlString = require('sqlstring'); const normalizeUpdateValues = (values, letObj = {}) => { function specialValue(val) { if (`${val}`.includes('(record.')) { return val; } if ( `${val}`.slice(0, 1) === '$' && _.has(letObj, `${val}`.replace('$', '')) ) { return `${val}`.replace('$', ''); } if (_.isObject(val)) { return JSON.stringify(val) .replace(/"'/g, '') .replace(/'"/g, '') .replace(/\\/g, ''); } if (_.isString(val)) { return `${SqlString.escape(val)}`.trim(); } if (Number(val)) { return val; } return val; } const getIncreaseValues = (incvalues) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { if (!_.isNumber(incvalue)) { throw new Error( 'Increment values in the `$inc` statement must be numbers' ); } else { st[key] = `'OLD.${key}+${incvalue}'`; } }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getPushValues = (incvalues, unique) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { st[key] = `'PUSH(OLD.${key}, ${specialValue(incvalue)}, ${unique})'`; }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getUnshiftValues = (incvalues, unique) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { st[key] = `'UNSHIFT(OLD.${key}, ${specialValue(incvalue)}, ${unique})'`; }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getPopValues = (incvalues) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { st[key] = `'POP(OLD.${key}'`; }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getShiftValues = (incvalues) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { st[key] = `'POP(OLD.${key}'`; }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getPullValues = (incvalues) => { const st = {}; if (_.isObject(incvalues)) { _.each(incvalues, (incvalue, key) => { if (_.isArray(incvalue)) { st[key] = `'REMOVE_VALUES(OLD.${key}, ${specialValue(incvalue)})'`; } else { throw new Error( 'The Values of the `$pull` statement must be an Array oject' ); } }); } else { throw new Error('The Values of the `$inc` statement must be an oject'); } return st; }; const getAndOrValues = (andorvalues) => { let st = {}; if (_.isArray(andorvalues)) { _.each(andorvalues, (val) => { st = { ...st, ...val }; }); } else { throw new Error('The Values of the `$and` statement must be an oject'); } return st; }; let newvalues = {}; _.each(values, (value, key) => { switch (key) { case '$inc': newvalues = { ...newvalues, ...getIncreaseValues(value) }; break; case '$pop': newvalues = { ...newvalues, ...getPopValues(value) }; break; case '$shift': newvalues = { ...newvalues, ...getShiftValues(value) }; break; case '$unshift': newvalues = { ...newvalues, ...getUnshiftValues(value, false) }; break; case '$unshiftset': newvalues = { ...newvalues, ...getUnshiftValues(value, false) }; break; case '$push': newvalues = { ...newvalues, ...getPushValues(value, false) }; break; case '$pushset': newvalues = { ...newvalues, ...getPushValues(value, true) }; break; case '$pull': newvalues = { ...newvalues, ...getPullValues(value) }; break; case 'and': newvalues = { ...newvalues, ...getAndOrValues(value) }; break; case '$and': newvalues = { ...newvalues, ...getAndOrValues(value) }; break; default: newvalues = { ...newvalues, [key]: value }; break; } }); return newvalues; }; module.exports = normalizeUpdateValues;