src/support/viewObjects.js

Summary

Maintainability
A
2 hrs
Test Coverage
"use strict";


const waigo = global.waigo,
  _ = waigo._,
  Q = waigo.load('support/promise');



/**
 * The name of the method which when called will return a view object representation of the callee.
 * @type {String}
 */
const METHOD_NAME = exports.METHOD_NAME = 'toViewObject';




/**
 * Get yieldable for converting given object into a view object.
 *
 * @param {Object} ctx A request context.
 * @param  {*} inputObject The object.
 * @return A yieldable value.
 */
const toViewObjectYieldable = exports.toViewObjectYieldable = function(inputObject, ctx) {

  if (inputObject) {
    // if it's one of our model schema types
    // (see https://github.com/hiddentao/simple-nosql-schema)
    switch (inputObject) {
      case String:
        return Q.resolve('String');
      case Boolean:
        return Q.resolve('Boolean');
      case Number:
        return Q.resolve('Number');
      case Date:
        return Q.resolve('Date');
      case Object:
        return Q.resolve('Object');
      case Array:
        return Q.resolve('Array');
    }

    // has view object method
    if ('function' === typeof inputObject[METHOD_NAME]) {
      return inputObject[METHOD_NAME].call(inputObject, ctx);
    }
    // is an array
    else if (_.isArray(inputObject)) {
      // recursive call on all children
      return inputObject.map(function(local) {
        return toViewObjectYieldable(local, ctx);
      });
    }
    // is an object
    else if (_.isPlainObject(inputObject)) {
      let yieldables = {};

      for (let idx in inputObject) {
        yieldables[idx] = toViewObjectYieldable(inputObject[idx], ctx);
      }

      return yieldables;
    }
  }

  return Q.resolve(inputObject);
};