Home Reference Source

lib/resource-controller/ResourceController.js

const debug = require('debug')('sequelize-resource:resource-controller');
const ResourceError = require('../errors/ResourceError');
const SequelizeError = require('../errors/SequelizeError');
const errorCodes = require('../errors/error_map');
/**
 * @class ResourceController
 * @author Marco Villarreal
 */
class ResourceController {
  /**
   * @property SORT_ORDERS
   * @static
   * @type {Array}
   */
  static get SORT_ORDERS() {
    return ['ASC', 'DESC'];
  }

  /**
   * @constructor
   * @param {Sequelize} sequelize
   * @param {Sequelize.Model} model
   */
  constructor(sequelize, model) {
    this.sequelize = sequelize;
    this.model = model;
    this.modelAttributes = Object.keys(this.model.attributes);
    this.getPrimaryKey();
    this.ERROR_CODES = errorCodes;
  }

  /**
   * @method sortOrderSupported
   * @param {String} sortOrder
   * @return {Boolean}
   */
  sortOrderSupported(sortOrder) {
    return ResourceController.SORT_ORDERS.indexOf(sortOrder.toUpperCase()) >= 0;
  }

  /**
   * @method attributeExists
   * @param {String} attribute
   * @return {Boolean}
   */
  attributeExists(attribute) {
    return this.modelAttributes.indexOf(attribute) >= 0;
  }

  /**
   * @method setBaseURL
   * @param {String} baseURL
   */
  setBaseURL(baseURL) {
    if (this.baseURL == null) {
      this.baseURL = baseURL;
    }
  }

  /**
   *
   * @method _getPrimaryKey
   * @return {Array}
   */
  getPrimaryKey() {
    if (!this.primaryKey) {
      this.primaryKey = Object.keys(this.model.primaryKeys);
    }
    return this.primaryKey;
  }

  /**
   * @method sequelizeError
   * @param {Error} originalError
   * @return {SequelizeError}
   */
  sequelizeError(originalError) {
    return new SequelizeError(originalError);
  }

  /**
   * @method resourceError
   * @param {String} errorCode
   * @param {String} message
   * @returns {ResourceError}
   */
  resourceError(errorType, message) {
    return new ResourceError(errorType, message);
  }
}

ResourceController.prototype.findOne = require('./methods/findOne')(debug);
ResourceController.prototype.findAll = require('./methods/findAll')(debug);
ResourceController.prototype.destroy = require('./methods/destroy')(debug);
ResourceController.prototype.update = require('./methods/update')(debug);
ResourceController.prototype.create = require('./methods/create')(debug);

module.exports = ResourceController;