RackHD/on-http

View on GitHub
lib/fittings/swagger_locals.js

Summary

Maintainability
A
1 hr
Test Coverage
// Copyright 2016, EMC, Inc.

'use strict';

var injector = require('../../index.js').injector;
var _ = injector.get('_');    // jshint ignore:line
var Promise = injector.get('Promise');    // jshint ignore:line
var debug = require('debug')('swagger:locals'); // jshint ignore:line
var Error = injector.get('Errors'); // jshint ignore:line

var skuParamHandler = function(context, value) {
    var injector = require('../../index.js').injector;
    var nodeServiceApi = injector.get('Http.Services.Api.Nodes');
    return nodeServiceApi.getNodeById(value)
    .then(function(node) {
        if(node.sku) {
            context.response.locals.scope.unshift(node.sku);
        }
    })
    .catch(function() {
        debug('Skipping processing in skuParamHandler for %s', value);
    });
};

var skuChassisParamHandler = function(context, value) {
    var injector = require('../../index.js').injector;
    var nodeServiceApi = injector.get('Http.Services.Api.Nodes');
    return nodeServiceApi.getAllNodes({
        or: [
            {id: value},
            {name: {'contains': value}}
        ]
    })
    .then(function(node) {
        if(node.length !== 1) {
            return [];
        }
        var encloses =  _(node[0].relations)
            .filter({relationType: 'encloses'})
            .pluck('targets')
            .flattenDeep()
            .value();
        return Promise.map(encloses, function(enclosed) {
            return nodeServiceApi.getNodeById(enclosed);
        });
    })
    .then(function(enclosedNodes) {
        if(_.every(enclosedNodes, function(node) {
            return node.sku && node.sku === enclosedNodes[0].sku;
        })) {
            context.response.locals.scope.unshift(enclosedNodes[0].sku);
        }
    })
    .catch(function() {
        debug('Skipping processing in skuChassisParamHandler for %s', value);
    });
}

module.exports = function create() {
    var anchorFuncs = {
        sku: skuParamHandler,
        skuChassis: skuChassisParamHandler
    };
    var anchors = _.keys(anchorFuncs);

    return function swagger_locals(context, next) {    // jshint ignore:line
        var promises = [];
        var operation = context.request.swagger.operation;
        _.forEach(operation.parameterObjects, function(param) {
            if(-1 !== _.indexOf(anchors, param['x-param-handler'])) {
                var value = _.get(context.request.swagger.params, [param.name, 'raw'].join('.') );
                promises.push( anchorFuncs[param['x-param-handler']].apply(null, [context, value]) );
            }
        });

        return Promise.all(promises).then(function() {
            next();
        });
    };
};