Home Identifier Source Repository

src/lib/model.js

/**
 * Exports Joi so no additional import/require needed
 */
export const Joi = require('joi');

/**
 * Exports the core model object
 * @namespace model
 */
export const model = {};

/**
 * Stores the models and their versions in memory
 * @property {Object}
 */
model.store = {};

/**
 * Adds a model to the store
 * @param {Object} m The model to add
 */
model.add = (m) => {
  // Ensure required properties
  if (!m.name || !m.version || !m.schema) {
    throw new Error('Model must contain a name, version and schema');
  }
  // Check if model exists
  if (!model.store[m.name]) {
    // Create new store entry
    model.store[m.name] = {};
  }
  // Build model object
  let modelObj = {};
  Object.keys(m).forEach((prop) => {
    if (prop !== 'version' && prop !== 'name') {
      modelObj[prop] = m[prop];
    }
  });
  // Append to existing store entry with version and schema
  model.store[m.name][m.version] = modelObj;
};

/**
 * Initializes a model
 * @memberof model
 * @param {String} m The model name
 */
model.init = (m) => {
  // Ensure model is defined
  if (!model.store[m]) {
    throw new Error('Model not defined');
  }
  // Get model object
  return {
    defaultVersion: Object.keys(model.store[m]).pop(),
    schemas: model.store[m],
    validate: function (data, version) {
      const v = version || this.defaultVersion;
      // Return validation
      return Joi.validate(data, Joi.object().keys(this.schemas[v].schema), (err) => {
        if (err) {
          return model.formatValidationError(err);
        }
        return null;
      });
    }
  };
};

/**
 * Formats validation error
 * @memberof model
 * @param {Object} err The error returned from failing Joi validation
 * @returns {String|Object} The formatted validation error
 */
model.formatValidationError = (err) => {
  if (model.customValidationError) {
    // A custom formatter is defined
    return model.customValidationError(err);
  }
  return err;
};

/**
 * Placeholder for custom formatter function
 * @memberof model
 */
model.customValidationError = false;