UNPKG

libpiggy

Version:

Use a PostgreSQL database like a JSON document store.

128 lines (95 loc) 2.96 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _defaultsDeep = require('lodash/defaultsDeep'); var _defaultsDeep2 = _interopRequireDefault(_defaultsDeep); var _isString = require('lodash/isString'); var _isString2 = _interopRequireDefault(_isString); var _isNumber = require('lodash/isNumber'); var _isNumber2 = _interopRequireDefault(_isNumber); var _createClient = require('./create-client'); var _createClient2 = _interopRequireDefault(_createClient); var _get = require('./get'); var _get2 = _interopRequireDefault(_get); var _set = require('./set'); var _set2 = _interopRequireDefault(_set); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const getText = function ({ table, existingKey, columnNames }) { return `UPDATE "${table}" SET ("${columnNames.val}", "${columnNames.updatedAt}") = ($1, current_timestamp) WHERE "${columnNames.key}" = '${existingKey}';`; }; const getVal = function ({ existingVal, newVal, merge }) { let val = {}; if (merge && existingVal) { val = (0, _defaultsDeep2.default)({}, newVal, existingVal); } else { val = newVal; } return val; }; const upsert = (() => { var _ref = (0, _asyncToGenerator3.default)(function* ({ store, client, table, key, not, val: newVal, options, generateKeyFn }, globals) { let clientCreated = false; try { if (!client) { client = yield (0, _createClient2.default)(options, globals); clientCreated = true; } const { columnNames } = store.settings; const { merge } = options || {}; let existing; if (key) { existing = yield (0, _get2.default)({ store, client, table, key, not, options }); } if (!existing || !existing.key) { let newKey; if ((0, _isString2.default)(key) || (0, _isNumber2.default)(key)) { newKey = key; } return (0, _set2.default)({ store, client, table, key: newKey, val: newVal, options, generateKeyFn }); } const existingKey = existing.key; const existingVal = existing.val; const text = getText({ table, existingKey, columnNames }); const val = getVal({ existingVal, newVal, merge }); const values = [val]; yield client.query({ text, values }); return (0, _get2.default)({ store, client, table, key: existingKey, options }); } catch (error) { throw error; } finally { if (clientCreated && client) { client.close(); } } }); return function upsert(_x, _x2) { return _ref.apply(this, arguments); }; })(); exports.default = upsert;