endpoints/endpoints

View on GitHub
es5/store-bookshelf/lib/destructure.js

Summary

Maintainability
B
5 hrs
Test Coverage
// FIXME: this needs to be refactored to support other api formats, or
// moved wholesale into another model

'use strict';

exports.__esModule = true;
exports['default'] = destructure;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _lodash = require('lodash');

var _lodash2 = _interopRequireDefault(_lodash);

var _columns = require('./columns');

var _columns2 = _interopRequireDefault(_columns);

var _to_one_relations = require('./to_one_relations');

var _to_one_relations2 = _interopRequireDefault(_to_one_relations);

var _all_relations = require('./all_relations');

var _all_relations2 = _interopRequireDefault(_all_relations);

function destructure(model) {
  var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];

  var relationships = params.relationships || {};
  var relationshipNames = _lodash2['default'].keys(relationships);
  var allRels = _all_relations2['default'](model);
  var toOneRelsMap = _to_one_relations2['default'](model);
  var toOneRels = Object.keys(toOneRelsMap);
  var toManyRels = _lodash2['default'].difference(allRels, toOneRels);
  var linkedToOneRels = _lodash2['default'].intersection(relationshipNames, toOneRels);
  var linkedToManyRels = _lodash2['default'].intersection(relationshipNames, toManyRels);

  // TODO blow up here with kapow, someone is trying to link something that
  // doesn't exist.
  //const badRelations = _.difference(linkRelations, allRels);

  // TODO we need a hook to check if the target related resources exist
  // so we can blow up if they don't.
  // This hook should have context about the request so we can enforce
  // permissions based on who is trying to update/create something.
  var attributes = linkedToOneRels.reduce(function (result, relationName) {
    var relation = relationships[relationName];
    var fkey = toOneRelsMap[relationName];
    var value = relation.data && relation.data.id;
    result[fkey] = value;
    return result;
  }, params.attributes || {});

  var relations = linkedToManyRels.map(function (relationName) {
    var relation = relationships[relationName];
    return {
      name: relationName,
      data: relation.data
    };
  });

  return _columns2['default'](model).then(function (modelColumns) {
    if (_lodash2['default'].contains(modelColumns, 'id') && params.id) {
      attributes.id = params.id;
    }
    return { attributes: attributes, relations: relations };
  });
}

module.exports = exports['default'];