UNPKG

@linaframework/arango-orm

Version:

> Please check out https://github.com/awesome-graphql-space/lina and https://github.com/oknoah/final/packages/arangolize for similar projects that MAY be more up to date

364 lines (312 loc) 10 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _create = require('babel-runtime/core-js/object/create'); var _create2 = _interopRequireDefault(_create); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _arangojs = require('arangojs'); var _arangojs2 = _interopRequireDefault(_arangojs); var _schema = require('../schemas/schema'); var _schema2 = _interopRequireDefault(_schema); var _lodash = require('lodash'); var _arangolize = require('arangolize'); var _arangolize2 = _interopRequireDefault(_arangolize); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Model = function () { function Model() { (0, _classCallCheck3.default)(this, Model); } (0, _createClass3.default)(Model, [{ key: 'save', /******************* public methods *******************/ value: async function save() { return this.constructor.save(this); } }, { key: 'update', value: async function update() { return this.constructor.update(this); } }, { key: 'remove', value: async function remove() { return this.constructor.remove(this); } }, { key: 'restore', value: async function restore() { return this.constructor.restore(this); } }], [{ key: '_getSchema', // user schema value: function _getSchema() { if (!this._normalSchema) { this._normalSchema = new _schema2.default(this.schema); } return this._normalSchema; } // connection options }, { key: '_getDatabase', value: async function _getDatabase() { if (Model._database) { return Model._database; } var dbName = this.options.database; var host = this.options.host || 'localhost'; var port = this.options.port || 8529; var username = this.options.username || 'root'; var password = this.options.password || ''; var protocol = this.options.protocol || '' + (host === 'localhost' ? 'http' : 'https'); var url = this.options.url || protocol + '://' + username + ':' + password + '@' + host + ':' + port; var db = (0, _arangojs2.default)({ url: url }); try { await db.createDatabase(dbName); } catch (e) { // throw new Error(get(e, 'response.body.errorMessage', e)) } db.useDatabase(dbName); Model._database = db; return db; } }, { key: '_getCollection', value: async function _getCollection() { if (this._collection) { await this._setIndexes(this._collection); return this._collection; } var db = await this._getDatabase(); var collection = db.collection(this.name); try { await collection.create(); await this._setIndexes(collection); } catch (e) {} return this._collection = collection; } }, { key: '_setIndexes', value: async function _setIndexes(collection) { var schema = this._getSchema(); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(schema.fields), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var field = _step.value; if (!field.options.index) continue; var path = field.path.join('.'); var unique = field.options.unique; await collection.createHashIndex(path, { unique: unique }); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } }, { key: '_call', value: async function _call(method) { try { var collection = await this._getCollection(); if (!collection[method]) { throw Error('Collection has no method \'' + method + '\''); } for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return await collection[method].apply(collection, args); } catch (e) { throw new Error((0, _lodash.get)(e, 'response.body.errorMessage', e)); } } }, { key: '_validate', value: function _validate(data) { var schema = this._getSchema(); schema.validate(data); } }, { key: '_getDocument', value: function _getDocument(documentHandle) { return this._call('document', documentHandle); } }, { key: '_getDocuments', value: function _getDocuments(documentHandles) { return this._call('lookupByKeys', documentHandles); } }, { key: '_createModelByDocument', value: function _createModelByDocument(document) { var model = (0, _create2.default)(this.prototype); this._documentToModel(model, document); model.constructor(); return model; } }, { key: '_documentToModel', value: function _documentToModel(model, document) { var schema = this._getSchema(); schema.documentToModel(model, document); return model; } }, { key: '_modelToDocument', value: function _modelToDocument(model) { var schema = this._getSchema(); var document = {}; schema.modelToDocument(model, document); return document; } /******************* public static methods *******************/ }, { key: 'add', value: async function add(data) { this._validate(data); data = this._modelToDocument(data); data._removed = false; data.createdAt = new Date().toISOString(); var documentHandle = await this._call('save', data); var document = await this._call('document', documentHandle); return this._createModelByDocument(document); } }, { key: 'get', value: async function get(documentHandle) { var document = await this._getDocument(documentHandle); return this._createModelByDocument(document); } }, { key: 'getArr', value: async function getArr(documentHandles) { var _this = this; var documents = await this._getDocuments(documentHandles); return documents.map(function (document) { return _this._createModelByDocument(document); }); } }, { key: 'save', value: async function save(model) { this._validate(model); var document = this._modelToDocument(model); document.updatedAt = new Date().toISOString(); var newHandle = await this._call('update', model._id, document); model._rev = newHandle._rev; return model; } }, { key: 'update', value: async function update(model) { var document = await this._getDocument(model); this._documentToModel(model, document); return model; } }, { key: 'remove', value: async function remove(model) { model._removed = true; return this.save(model); } }, { key: 'restore', value: async function restore(model) { model._removed = false; return this.save(model); } }, { key: 'find', value: async function find(args) { var _this2 = this; var andCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var db = await this._getDatabase(); var _ref = await (0, _arangolize2.default)((0, _extends3.default)({ collection: this.name }, args)), bindVars = _ref.bindVars, query = _ref.query; var cursor = await db.query({ query: query, bindVars: bindVars }); var docs = await cursor.all(); var documents = docs[0]; if (documents) { var limit = args.limit, include = args.include; var modeled = await _promise2.default.all(documents.data.map(async function (data) { var modelFromDoc = include ? data : _this2._createModelByDocument(data); return modelFromDoc; })); if (andCount) { return { data: modeled, meta: documents.meta }; } return limit === 1 ? modeled[0] : modeled; } } }, { key: 'findOne', value: async function findOne() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; args.skip = 0; args.limit = 1; var model = await this.find(args); return model; } }, { key: 'findAndCount', value: async function findAndCount() { var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var results = await this.find(args, true); return results; } }, { key: 'count', value: async function count(selector) { var cursor = await this._call('byExample', selector); return cursor.count; } }, { key: 'have', value: async function have(selector) { var model = await this.findOne(selector); return !!model; } }]); return Model; }(); Model.options = null; Model.schema = null; Model._normalSchema = null; Model._collection = null; Model._database = null; Model.aql = _arangojs.aql; exports.default = Model;