{"version":3,"sources":["jsdelivr-header.js","/npm/structure-root-model@0.2.0/index.js"],"names":[],"mappings":"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","file":"/npm/structure-root-model@0.2.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/structure-root-model@0.2.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Module Dependencies\n *\n * @ignore\n */\nconst moment          = require('moment')\nconst EventEmitter    = require('structure-event-emitter')\nconst mixin           = require('structure-mixin')\nconst r               = require('structure-driver')\nconst ShortId         = require('structure-short-id-service')\nconst uuid            = require('structure-uuid')\nconst Websockets      = require('structure-websocket-server')\n\nfunction convertDateToDb(d) {\n\n  var date  = (d) ? moment(d) : moment(),\n      year  = parseInt(date.format('YYYY')),\n      month = parseInt(date.format('M')),\n      day   = parseInt(date.format('D'))\n\n  return r.time(year, month, day, process.env.TIME_ZONE)\n\n}\n\nfunction convertDateToDatabaseTime7(year, month, day, hour = 0, minute = 0, second = 0, timezone = '-04:00') {\n\n  // Allows for the first argument to be \"2016-06-30\"\n  if(arguments.length == 3) {\n    var date  = moment(arguments[0])\n\n    year   = parseInt(date.format('YYYY'))\n    month  = parseInt(date.format('M'))\n    day    = parseInt(date.format('D'))\n    hour   = parseInt(arguments[1])\n    minute = parseInt(arguments[2])\n  }\n\n  // Makes second and timezone optional\n  if(arguments.length == 5) {\n    year   = parseInt(arguments[0])\n    month  = parseInt(arguments[1])\n    day    = parseInt(arguments[2])\n    hour   = parseInt(arguments[3])\n    minute = parseInt(arguments[4])\n  }\n\n  year   = parseInt(year)\n  month  = parseInt(month)\n  day    = parseInt(day)\n  hour   = parseInt(hour)\n  minute = parseInt(minute)\n  second = parseFloat(second)\n\n  return r.time(year, month, day, hour, minute, second, timezone)\n}\n\nfunction convertEpochToDate(e) {\n  return moment.unix(e).format('YYYY-MM-DD')\n}\n\nfunction convertEpochToDatabaseTime4(e) {\n  var date = this.convertEpochToDate(e)\n\n  return this.convertDateToDatabaseTime4(date)\n}\n\n/**\n * RootModel Class\n *\n * @public\n * @class RootModel\n */\nclass RootModel {\n\n  /**\n   * RootModel constructor\n   *\n   * @public\n   * @constructor\n   * @param {Object} options - Options\n   */\n  constructor(options = {}) {\n\n    /**\n     * Default parameters\n     *\n     * @private\n     * @type {Object}\n     */\n    this.defaults = {\n      /*\n      NOTE: Whether to emit a change feed; if this is false, then web sockets\n      will not fire regardless of 'sockets' value. This is because without\n      the change feed, the web sockets have nothing to fire.\n\n      In the future sockets may fire without change feeds\n      */\n      changeFeed: (typeof process.env.CHANGE_FEED == 'boolean') ? process.env.CHANGE_FEED : false,\n      sockets: true // whether to emit web socket events if web sockets are available\n    }\n\n    /**\n     * Assign options\n     *\n     * @private\n     * @type {Object}\n     */\n    this.options = Object.assign({}, this.defaults, options)\n\n    /**\n     * Logs\n     *\n     * @private\n     * @type {String}\n     */\n    this.logger = options.logger || console\n    if(!this.logger.debug) {\n      this.logger.debug = console.log.bind(console)\n    }\n\n    /**\n     * Application ID\n     *\n     * @private\n     * @type {String}\n     */\n    this.applicationId = options.applicationId\n\n    /**\n     * Organization ID\n     *\n     * @private\n     * @type {String}\n     */\n    this.organizationId = options.organizationId\n\n    /**\n     * User ID\n     *\n     * @private\n     * @type {String}\n     */\n    this.userId = options.userId\n\n    /**\n     * Whether the model should fire change feed\n     *\n     * @private\n     * @type {Boolean}\n     */\n    this.changeFeed = options.changeFeed\n\n    /**\n     * List of all cursors opened on all models\n     *\n     * @private\n     * @type {Array}\n     */\n    this.cursors = options.cursors || this.cursors || []\n\n    /**\n     * Keep track of open cursors on model\n     *\n     * @private\n     * @type {Array}\n     */\n    this._cursors = []\n\n    /**\n     * Name of the local key for relations\n     *\n     * @private\n     * @type {String}\n     */\n    this.localKey = options.localKey || this.localKey\n\n    /**\n     * Table relationships\n     *\n     * @private\n     * @type {Boolean}\n     */\n    this.relations = options.relations\n\n    /**\n     * Name of the default table the model works with.\n     *\n     * @private\n     * @type {String}\n     */\n    this.table = options.table || this.table\n\n    /**\n     * Table name\n     *\n     * @private\n     * @type {String}\n     */\n    if(!this.table) {\n      throw new Error('Table must be defined')\n    }\n\n    if(this.changeFeed) {\n      this.listenToChanges()\n    }\n\n  }\n\n  /**\n   * Check the existence of a key/value pair, with key being an index\n   *\n   * @public\n   */\n  checkExistence(key, val) {\n\n    let exists = false\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n\n        const filter = {}\n        filter[key] = val\n        filter.status = 'active'\n\n        const res = await r\n          .table(this.table)\n          //.getAll(r.args(['active']), {index: 'status'}) <-- Not sure where this index was being set before\n          .filter(filter)\n          .limit(1)\n\n        if(res.length > 0) exists = true\n\n        resolve({exists})\n\n      }\n      catch(e) {\n        this.logger.error(e)\n\n        resolve({exists})\n      }\n\n    })\n\n  }\n\n  /**\n   * Close open cursors\n   *\n   * @public\n   */\n  closeCursors() {\n    this._cursors.forEach((cursor) => {\n      var tokenId = cursor.token\n\n      // Remove this cursor from the full cursor list\n      for(let i = 0, l = cursors.length; i < l; i++) {\n        var c = cursors[i]\n\n        if(c.token == tokenId) {\n          cursors.splice(i, 1)\n        }\n      }\n\n      cursor.close()\n    })\n\n    this._cursors = []\n  }\n\n  /**\n   * Create, or save, data for the model\n   *\n   * @public\n   * @param {Object} pkg - Data to be saved\n   * @param {Object} options - Options\n   */\n  create(pkg = {}, options = {}) {\n\n    return new Promise( async (resolve, reject) => {\n\n      const tmpPkg = Object.assign({}, pkg)\n      const keys   = Object.keys(tmpPkg)\n\n      pkg.createdAt  = r.now()\n      pkg.id         = pkg.id || uuid()\n\n      const id = pkg.id\n\n      pkg.sid        = new ShortId().issue(id)\n      if(!pkg.status) {\n        pkg.status = 'active'\n      }\n      pkg.updatedAt  = r.now()\n      pkg.__version  = process.env.npm_package_version\n\n      const insertOptions = {\n        returnChanges: (typeof options.returnChanges == 'boolean') ? options.returnChanges : true\n      }\n\n      try {\n\n        /*\n        NOTE:\n        This will take the package keys, and see if any of the keys belong to a relationship, as defined on the model\n        */\n        if(this.relations) await this.createRelations(pkg, tmpPkg, keys, id)\n\n        var res = await r.table(options.table || this.table).insert(pkg, insertOptions)\n        if(res.errors && res.errors > 0) {\n          return reject(res.first_error)\n        }\n\n        let doc = {}\n\n        if(insertOptions.returnChanges) {\n          doc = res.changes[0].new_val\n        }\n\n        resolve(doc)\n\n      }\n      catch(err) {\n        this.logger.error('Root Model: Could not create', err)\n\n        reject(err)\n      }\n\n    })\n  }\n\n  createReference(pkg, options = {}) {\n\n    if(!options.table) throw new Error({\n      message: 'Reference requires a table'\n    })\n\n    return this.create.call(this, pkg, options)\n\n  }\n\n  createRelations(pkg, tmpPkg, keys, localKeyId) {\n    //console.error('this', this.table, pkg)\n    let refs = []\n\n    for(let i = 0, l = keys.length; i < l; i++) {\n      const key = keys[i]\n\n      if(this.relations.belongsTo instanceof Array) {\n        for(let j = 0, k = this.relations.belongsTo.length; j < k; j++) {\n          const relation = this.relations.belongsTo[j]\n\n          /*\n          NOTE:\n          If the relationship has a join table,\n          has a foreign key, and that foreign key is equal to the pkg key passed in\n          */\n          if(relation.joinTable && relation.link && relation.link.foreignKey && relation.link.foreignKey == key) {\n            const strip = (typeof relation.strip == 'boolean') ? relation.strip : true // Strip join key by default\n\n            // Don't save the join key\n            if(strip) {\n              delete pkg[key]\n            }\n\n            let insert = {}\n            insert[relation.link.localKey] = localKeyId // Local Key\n            insert[key] = tmpPkg[key] // Foreign Key\n\n            refs.push(r.table(relation.joinTable).insert(insert))\n          }\n        }\n      }\n\n      if(this.relations.hasManyAndBelongsTo instanceof Array) {\n        for(let j = 0, k = this.relations.hasManyAndBelongsTo.length; j < k; j++) {\n          const relation = this.relations.hasManyAndBelongsTo[j]\n\n          /*\n          NOTE:\n          If the relationship has a join table,\n          has a foreign key, and that foreign key is equal to the pkg key passed in\n          */\n          if(relation.joinTable && relation.link && relation.link.foreignKey && relation.link.foreignKey == key) {\n            const strip = (typeof relation.strip == 'boolean') ? relation.strip : true // Strip join key by default\n\n            // Don't save the join key\n            if(strip) {\n              delete pkg[key]\n            }\n\n            let insert = {}\n            insert[relation.link.localKey] = localKeyId // Local Key\n            insert[key] = tmpPkg[key] // Foreign Key\n\n            refs.push(r.table(relation.joinTable).insert(insert))\n          }\n        }\n      }\n\n    }\n\n    return Promise.all(refs)\n\n  }\n\n  /**\n   * Delete by id\n   *\n   * @public\n   * @param {String} id\n   * @return {object} the doc deleted or false if not found\n   */\n  deleteById(id, options = {}) {\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n        var deletedDoc = await this.updateById(id, {status: 'deleted'})\n\n        if(this.relations) await this.deleteRelations(id)\n\n        return resolve(deletedDoc)\n      }\n      catch(err) {\n        this.logger.error('Root Model: Could not delete', err)\n\n        reject(err)\n      }\n    })\n  }\n\n  /**\n   * Delete many by id\n   *\n   * @public\n   * @param {String} id\n   * @return {array} the entries deletes\n   */\n  deleteMany(arrayIds){\n    return new Promise( async (resolve, reject) => {\n      try {\n        var deletedDocs = new Array()\n        for(let i=0;i<arrayIds.length;i++){\n          deletedDocs.push(this.updateById(arrayIds[i], {status: 'deleted'}))\n        }\n        return resolve(await Promise.all(deletedDocs))\n      }\n      catch(err) {\n        this.logger.error('Root Model: Could not delete', err)\n\n        reject(err)\n      }\n    })\n  }\n\n  deleteReference(pkg = {}, options = {}) {\n\n    if(!options.table) throw new Error({\n      message: 'Reference requires a table'\n    })\n\n    return r.table(options.table).filter(pkg).delete()\n\n  }\n\n  /**\n   * Delete references\n   *\n   * @public\n   * @param {Object} pkg\n   * @param {Array} keys\n   * @param {String} localKeyId\n   * @return {Array} - References deleted\n   */\n  deleteRelations(localKeyId) {\n\n    let refs = []\n\n    if(this.relations.belongsTo instanceof Array) {\n      for(let j = 0, k = this.relations.belongsTo.length; j < k; j++) {\n        const relation = this.relations.belongsTo[j]\n\n        if(relation.joinTable && relation.link && relation.link.foreignKey) {\n\n          let insert = {}\n          insert[relation.link.localKey] = localKeyId // Local Key\n\n          refs.push(r.table(relation.joinTable).filter(insert).delete())\n        }\n      }\n    }\n\n    if(this.relations.hasMany instanceof Array) {\n      for(let j = 0, k = this.relations.hasMany.length; j < k; j++) {\n        const relation = this.relations.hasMany[j]\n\n        if(relation.joinTable && relation.link && relation.link.foreignKey) {\n\n          let insert = {}\n          insert[relation.link.localKey] = localKeyId // Local Key\n\n          refs.push(r.table(relation.joinTable).filter(insert).delete())\n        }\n      }\n    }\n\n    if(this.relations.hasManyAndBelongsTo instanceof Array) {\n      for(let j = 0, k = this.relations.hasManyAndBelongsTo.length; j < k; j++) {\n        const relation = this.relations.hasManyAndBelongsTo[j]\n\n        if(relation.joinTable && relation.link && relation.link.foreignKey) {\n\n          let insert = {}\n          insert[relation.link.localKey] = localKeyId // Local Key\n\n          refs.push(r.table(relation.joinTable).filter(insert).delete())\n        }\n      }\n    }\n\n    return Promise.all(refs)\n\n  }\n\n  destroyById(id) {\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n        var deletedDoc = await r.table(this.table).get(id).delete()\n\n        if(this.relations) await this.deleteRelations(id)\n\n        return resolve(deletedDoc)\n      }\n      catch(err) {\n        this.logger.error('Could not delete', err)\n\n        reject(err)\n      }\n\n    })\n\n  }\n\n  /*\n  NOTE:\n\n  get(id, 'documents')\n\n  get(id, {\n    node: 'documents',\n    organizationId,\n    status: 'draft'\n  })\n\n  get('documents', {\n    node: 'users'\n  })\n\n  get(id, {\n    localKey,\n    table: 'users'\n  })\n\n  // 1:1 Get bucket belonging to organization\n  get(bucketId, 'belongsTo', 'organization')\n  // 1:Many Organization has many buckets\n  get(organizationId, 'hasMany', 'buckets')\n  get(organizationId, 'hasMany', {node: 'buckets', ids: [bucket1, bucket2, etc...]})\n  get(organizationId, 'hasMany', {node: 'buckets', ids: [bucket1, bucket2, etc...]}, {orderBy: {date: 'desc'}})\n  // Many:Many\n  get('link', 'users')\n  get([group1, group2, etc...], 'link', 'users')\n  get([group1, group2, etc...], 'link', {node: 'users', [user1, user2, etc...]})\n  */\n  get(...args) {\n\n    let query = r.table(this.table)\n\n    switch(args.length) {\n\n      case 1:\n        throw new Error({\n          message: 'Use getById'\n        })\n\n      case 2:\n        throw new Error({\n          message: 'Many:Many is not supported yet'\n        })\n\n      case 3:\n\n        let localKey = null\n\n        // First arguments is an array\n        if(args[0] instanceof Array) {\n          localKey = r.args(args[0])\n        }\n        // First argument is an id\n        else {\n          localKey = args[0]\n        }\n\n\n    }\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n        const res = await query\n\n        resolve(res)\n      }\n      catch(e) {\n        reject(e)\n      }\n\n    })\n\n  }\n\n  /**\n   * Get all from table\n   * Default Limit 100 entries\n   * @public\n   */\n  getAll(ids = [], options = {}) {\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n        var { limit = 0,\n              paginate : {offset = 0} = {},\n              during : {from, to} = {},\n              during = false,\n              orderBy = 'updatedAt',\n              state = ['active'] } = options,\n            topLimit = offset != 0 ? offset + limit : undefined,\n            queryLimit = limit !=0 ? limit: 100\n\n        let query = r\n          .table(this.table)\n\n        if(ids.length > 0) {\n\n          query = query\n            .getAll(r.args(ids))\n\n        }\n\n        query = query\n          .orderBy(r.desc(orderBy))\n\n        if(offset && topLimit) {\n          query = query\n            .slice(offset, topLimit, {right_bound: 'closed'})\n        }\n\n        if(queryLimit) {\n          query = query\n            .limit(queryLimit)\n        }\n\n        if(from || to) {\n          query = query\n            .filter( (row)=> {\n              return row('date').during(convertDateToDb.call(this, from), convertDateToDb.call(this, to), { leftBound: 'closed'})\n            })\n        }\n\n        const res = await query.run()\n\n        resolve(res)\n\n      }\n      catch(e) {\n        reject(e)\n      }\n\n    })\n\n  }\n\n  /**\n   * Get model by id\n   *\n   * @public\n   * @param {String} id\n   */\n  getById(id) {\n\n    if(!id) return Promise.reject({\n      message: 'Method requires an Id for lookup'\n    })\n\n    // Short ID\n    if(id.length <= 10) {\n\n      return new Promise( async (resolve, reject) => {\n\n        try {\n          var doc = await r.table(this.table).filter({sid: id}).limit(1)\n          return resolve(this.getById(doc[0].id))\n        }\n        catch(err) {\n          this.logger.error(`Could not get object by short ID: ${id}`, err)\n\n          reject({\n            message: `Could not get object by short ID: ${id}`\n          })\n        }\n\n      })\n    }\n\n    // Long ID\n    else {\n\n      return new Promise( async (resolve, reject) => {\n\n        try {\n          let obj = await r.table(this.table).get(id)\n\n          if(!obj) {\n            return reject({\n              message: `Could not get object by ID: ${id}`\n            })\n          }\n\n          resolve(obj)\n        }\n        catch(e) {\n          this.logger.error(`Could not get object by ID: ${id}`, e)\n\n          reject(e)\n        }\n\n      })\n\n    }\n\n  }\n\n  /**\n   * Get reference\n   *\n   * @private\n   * @param {Object} options - Reference filter\n   */\n  getReference(options = {}) {\n    return new Promise( async (resolve, reject) => {\n\n      options.node = options.node || this.name\n\n      try {\n        var ref = await r.table('refs').filter(options).limit(1)\n\n        if(ref.length == 0) {\n          return reject({\n            message: 'Reference not found'\n          })\n        }\n\n        resolve(ref[0])\n      }\n      catch(e) {\n        this.logger.error('Reference not found', e)\n\n        reject(e)\n      }\n\n    })\n  }\n\n  /**\n   * Get model relationships\n   *\n   * @private\n   * @param {String} type- Relationship type\n   */\n  getRelations(type) {\n    var relations = []\n\n    Object.keys(relations).forEach( (relation) => {\n\n      if(relation == type) {\n        relations = relations[relation]\n      }\n\n    })\n\n    return relations\n  }\n\n  /**\n   * Listen to model changes\n   *\n   * @private\n   */\n  listenToChanges() {\n\n    r\n      .table(this.table)\n      .changes()\n      .run()\n      .then(this.onChangeFeed.bind(this))\n\n  }\n\n  /**\n   * When RethinkDB change feed is opened\n   *\n   * @private\n   * @param {Object} cursor - RethinkDB change feed cursor\n   */\n  onChangeFeed(cursor) {\n\n    cursors.push(cursor)\n    this._cursors.push(cursor)\n\n    cursor.each((err, change) => {\n      this.emit('change', change.new_val)\n\n      if(this.options.sockets) {\n        var wss = new Websockets()\n        wss.emit('change', change.new_val)\n      }\n\n    })\n\n  }\n\n  /**\n   * Create, or save, data for the model\n   *\n   * @private\n   * @param {String} type - Relationship type\n   * @param {String} id\n   * @param {Object} reference - Reference object\n   */\n  referenceTo(type, id, reference) {\n\n    return new Promise( (resolve, reject) => {\n      var inserts = []\n\n      Object.keys(reference).forEach( async (key) => {\n        var referencePkg = {}\n        referencePkg[`${this.entityName}Id`] = id // local key\n        referencePkg[key] = reference[key]  // foreign key\n\n        switch(type) {\n          case 'belongsTo':\n            //referencePkg.name = `${key.replace('Id', '')}_has_${this.name}`\n            referencePkg.type = 'belongsTo'\n\n            break\n        }\n\n        referencePkg.node = this.name\n\n        inserts.push(this.insertReference(referencePkg))\n      })\n\n      Promise\n        .all(inserts)\n        .then(resolve)\n        .catch(reject)\n\n    })\n\n  }\n\n  /**\n   * Update a model\n   *\n   * @public\n   * @param {String} id\n   * @param {Object} pkg - Data to be saved\n   * @param {Object} options - Options\n   */\n  updateById(id, pkg = {}, options = {}) {\n\n    options.returnChanges = (typeof options.returnChanges == 'boolean') ? options.returnChanges : true\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n        // Do not allow these to be updated\n        delete pkg.createdAt\n        delete pkg.id\n        delete pkg.sid\n\n        pkg.updatedAt  = r.now()\n        pkg.__version  = process.env.npm_package_version\n\n        const res = await r\n          .table(this.table)\n          .get(id)\n          .update(pkg, options)\n\n        if(!res.changes) {\n          this.logger.error('RootModel: RethinkDB was unable to update', res)\n\n          return reject()\n        }\n\n        const newVal = res.changes[0].new_val\n\n        /*\n        TODO:\n        Some modules will receive `newVal` as undefined without this :/\n        */\n        setTimeout(() => {\n          resolve(newVal)\n        }, 0)\n\n      }\n      catch(e) {\n        this.logger.error('Error updating', e)\n\n        reject(e)\n      }\n\n    })\n  }\n\n  updateMany(data = [],options){\n\n    return new Promise( async (resolve, reject) => {\n      try{\n        var updatedDocs = []\n        for(let i=0;i<data.length;i++){\n          updatedDocs.push(this.updateById(data[i].id, data[i].data , options ))\n        }\n\n        resolve(await Promise.all(updatedDocs))\n      }\n      catch(err) {\n        this.logger.error('Error updating', err)\n\n        reject(err)\n      }\n    })\n  }\n\n  /**\n   * Paginate the results of a query\n   * @public\n   * @param {Object} query - query object to paginate over\n   * @param {Object} options - options for pagination\n   * @param {number} options.limit - size of each page, default = 100\n   * @param {number} options.page - page number to fetch, default = 1\n   * @returns {Promise.Object} - Promise for results of pagination, in the form\n   *  {\n   *     pages: 3,\n   *     current: 1,\n   *     previous: false,\n   *     next: true,\n   *     results: [ ... ]\n   *  }\n   */\n  paginate(query, options = {}) {\n\n    return new Promise( async (resolve, reject) => {\n\n      try {\n\n        const page = options.page || 1\n        const limit = options.limit || 100\n        const skip = page > 0 ? limit * (page - 1) : 0\n\n        const total = await query.count()\n\n        query = query\n          .skip(skip)\n          .limit(limit)\n\n        const results = await query.run()\n\n        const totalPages = Math.ceil(total / limit)\n\n        let previous = false\n        if (page > totalPages) {\n          previous = totalPages\n        } else if (page - 1 > 0) {\n          previous = page - 1\n        }\n\n        resolve({\n          pagination: {\n            pages: totalPages,\n            current: page,\n            next: (page + 1 <= totalPages) ? page + 1 : false,\n            previous,\n            total,\n          },\n          results\n        })\n\n      } catch(e) {\n\n        reject(e)\n\n      }\n\n    })\n\n  }\n\n}\n\n/**\n * Mixin EventEmitter.prototype properties onto RootModel.prototype\n *\n * @ignore\n */\nmixin(RootModel, EventEmitter)\n\nmodule.exports = RootModel\n"]}