libpiggy
Version:
Use a PostgreSQL database like a JSON document store.
128 lines (95 loc) • 2.96 kB
JavaScript
;
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;