UNPKG

@parch-js/orm

Version:

ORM for parch providing record DSL

268 lines (226 loc) 9.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _restifyErrors = require("restify-errors"); var _restifyErrors2 = _interopRequireDefault(_restifyErrors); var _inflect = require("inflect"); var _inflect2 = _interopRequireDefault(_inflect); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * SQL Database dsl * * @class ORM * @constructor * @param {Object} models hash of <a href="http://docs.sequelizejs.com/en/v3/docs/models-definition/#definition" target="_blank">sequelize defined</a> models */ var ORM = function () { function ORM(models) { var _this = this; _classCallCheck(this, ORM); this._models = new Map(); Object.keys(models).forEach(function (model) { var modelName = _inflect2.default.singularize(model).toLowerCase(); _this._models.set(modelName, models[model]); }); } /** * Create a new model instance * * @method createRecord * @param {String} modelName lowercase singular model name * @param {Object} payload new instance data * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.createRecord("user", { firstName: "John" }); * ``` */ _createClass(ORM, [{ key: "createRecord", value: function createRecord(modelName, payload) { if (!payload) { return Promise.reject(new _restifyErrors2.default.BadRequestError("Missing or invalid body")); } var model = this._models.get(modelName); var record = model.build(payload); return record.validate().then(function (instance) { return instance.save(); }).catch(function (validation) { if (validation && validation.errors && validation.errors.length) { var validationErrors = validation.errors; var validationError = validationErrors[0]; throw new _restifyErrors2.default.UnprocessableEntityError(validationError.message); } else { throw new _restifyErrors2.default.UnprocessableEntityError(validation.message); } }); } /** * Destroy a record instance * * @method destroyRecord * @param {String} modelName lowercase singular model name * @param {Number|String} id id of the record to destroy * @return {Promise<void>} * @example * * ```javascript * return orm.destroyRecord("user", 1); * ``` */ }, { key: "destroyRecord", value: function destroyRecord(modelName, id) { return this._queryRecord(modelName, { id: id }).then(function (record) { return record.destroy(); }); } /** * Return all instances of a model and optionally pass a query object * * @method findAll * @param {String} modelName lowercase singular model name * @param {Object} where <a href="http://docs.sequelizejs.com/en/v3/docs/querying/#where" target="_blank">Sequelize Where clause</a> * @param {Object} options <a href="http://docs.sequelizejs.com/en/v3/api/model/#findoneoptions-promiseinstance" target="_blank"> * sequelize finder options * </a> * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.findAll("user"); * * // you can also query * * return orm.findAll("user", { firstName: { $like: "john" }}); * ``` */ }, { key: "findAll", value: function findAll(modelName, where, options) { var dataQuery = { where: where }; var model = this._models.get(modelName); var modelQuery = Object.assign(dataQuery, options); return model.findAll(modelQuery); } /** * Return a single instance by id * * @method findOne * @param {String} modelName lowercase singular model name * @param {Number|String} id id of the record to destroy * @param {Object} options <a href="http://docs.sequelizejs.com/en/v3/api/model/#findoneoptions-promiseinstance" target="_blank"> * sequelize finder options * </a> * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.findOne("user", 1); * ``` */ }, { key: "findOne", value: function findOne(modelName, id, options) { var dataQuery = { id: id }; return this._queryRecord(modelName, dataQuery, options); } /** * Like findOne but takes a query instead of an id * * @method queryRecord * @param {String} modelName lowercase singular model name * @param {Object} where <a href="http://docs.sequelizejs.com/en/v3/docs/querying/#where" target="_blank">Sequelize Where clause</a> * @param {Object} options <a href="http://docs.sequelizejs.com/en/v3/api/model/#findoneoptions-promiseinstance" target="_blank"> * sequelize finder options * </a> * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.queryRecord("user", { firstName: "John" }); * ``` */ }, { key: "queryRecord", value: function queryRecord() { return this._queryRecord.apply(this, arguments); } /** * Update a record * * @method updateRecord * @param {String} modelName lowercase singular model name * @param {Number|String} id id of the record to destroy * @param {Object} payload new instance data * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.updateRecord("user", 1, { firsName: "Joe" }); * ``` */ }, { key: "updateRecord", value: function updateRecord(modelName, id, payload) { if (!payload) { return Promise.reject(new _restifyErrors2.default.BadRequestError("Missing or invalid body")); } return this._queryRecord(modelName, { id: id }).then(function (record) { return record.update(payload); }).catch(function (err) { if (err.name === "SequelizeValidationError") { var _err$errors = _slicedToArray(err.errors, 1), validationError = _err$errors[0]; var error = _restifyErrors2.default.UnprocessableEntityError; var message = validationError.message; throw new error(message); } else { throw err; } }); } /** * Handles querying single records with either an id or other attribute query * This is handled in this separate private method to allow for further * extension of the highlevel api (findOne, queryRecord, etc) further upstream * * @method _queryRecord * @private * @param {String} modelName lowercase singular model name * @param {Object} where <a href="http://docs.sequelizejs.com/en/v3/docs/querying/#where" target="_blank">Sequelize Where clause</a> * @param {Object} options <a href="http://docs.sequelizejs.com/en/v3/api/model/#findoneoptions-promiseinstance" target="_blank"> * sequelize finder options * </a> * @return {Promise}<ModelInstance, RestError> * @example * * ```javascript * return orm.queryRecord("user", { firstName: "John" }); * ``` */ }, { key: "_queryRecord", value: function _queryRecord(modelName, where, options) { var dataQuery = { where: where }; var model = this._models.get(modelName); var modelQuery = Object.assign(dataQuery, options); return model.findOne(modelQuery).then(function (record) { if (!record) { var NotFound = _restifyErrors2.default.NotFoundError; var message = modelName + " does not exist"; throw new NotFound(message); } return record; }); } }]); return ORM; }(); exports.default = ORM; module.exports = exports["default"];