yoctore/yocto-mongoose

View on GitHub
src/modules/enum/index.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

var _       = require('lodash');
var fs      = require('fs');
var glob    = require('glob');
var joi     = require('joi');
var logger  = require('yocto-logger');

/**
 *
 * Manage all enums action from a valid given schema
 *
 * @date : 25/09/2015
 * @author : Mathieu ROBERT <mathieu@yocto.re>
 * @copyright : Yocto SAS, All right reserved
 *
 * @class Enums
 */
function Enums (logger, mongooseTypes) {
  /**
   * Logger instance
   *
   * @property logger
   */
  this.logger     = logger;

  /**
   * Enums list item
   *
   * @property enums
   */
  this.enums      = [];
  /**
   * Mongoose type can be useful on enumes block
   */
  this.Types      = mongooseTypes;
}

/**
 * Load enums value from given path
 *
 * @param {String} path given path to retreive model
 * @return {Boolean} true if load is ok false otherwise
 */
Enums.prototype.load = function (path) {
  try {
    // test is a valid path
    if (!_.isString(path) || _.isEmpty(path)) {
      throw 'Invalid path given.';
    }

    // validation schema
    var schema = joi.array().items(
      joi.object().required().keys({
        name  : joi.string().required().empty(''),
        value : joi.array().required().min(1)
      })
    );

    // check model definition & controller first
    var enums = glob.sync('**/*.json', {
      cwd       : path,
      realpath  : true
    });

    // read each file
    _.each(enums, function (m) {
      // load
      var data = JSON.parse(fs.readFileSync(m, 'utf-8'));

      // validate format
      var state = joi.validate(data, schema);

      // is valid format
      if (_.isNull(state.error)) {
        // push
        this.enums.push(state.value);
      } else {
        // invalid warning message
        this.logger.warning([ '[ Enums.load.parse ] -  Cannot load item for [', m, ']',
                              state.error ].join(' '));
      }
    }.bind(this));

    // flatten
    this.enums  = _.uniq(_.flatten(this.enums), 'name');
  } catch (e) {
    // warning message
    this.logger.error([ '[ Enums.load ] - Cannot load path from given enum path.', e ].join(' '));
    // invalid statement
    return false;
  }

  // default statement
  return true;
};

/**
 * Default get function to retreive a enums list from given name
 *
 * @param {String} name name to use to find enum list
 * @return {Array} enum array list
 */
Enums.prototype.get = function (name) {
  // is a valid string ?
  if (_.isString(name) && !_.isEmpty(name)) {
    // data is ok so try to get enums from given name
    if (_.isArray(this.enums) && !_.isEmpty(this.enums)) {
      // a valid statement or empty array if is not founded
      return _.result(_.find(this.enums, [ 'name', name ]), 'value') || [];
    } else {
      // warning message
      this.logger.warning('[ Enums.get ] - enums list is empty. try to load enums before get');
    }
  } else {
    // warning message
    this.logger.warning('[ Enums.get ] - given name is empty or not a string.');
  }

  // default statement
  return [];
};

// Default export
module.exports = function (l, types) {
  // is a valid logger ?
  if (_.isUndefined(l) || _.isNull(l)) {
    logger.warning('[ Enums.constructor ] - Invalid logger given. Use internal logger');
    // assign
    l = logger;
  }
  // default statement
  return new (Enums)(l, types);
};