BohemiaInteractive/bi-service

View on GitHub
lib/middleware/requestContentType.js

Summary

Maintainability
A
0 mins
Test Coverage
const _          = require('lodash');
const typeis     = require('type-is');
const BodyParser = require('body-parser');
const Promise    = require('bluebird');

const RequestError = require('../error/requestError.js');

/**
 * {Route} middleware which validates Content-Type header and parses the request
 * body
 */
module.exports = function requestContentTypeParserMiddleware(req, res) {
    const self = this;
    return Promise.try(function() {
        const type = req.header('content-type');

        let types        = self.route.$dataParserMiddleware.mediaTypes
        ,   mediaType    = typeis.is(type, types)
        ,   contentTypes = self.route.$dataParserMiddleware.contentTypes;


        if (type && mediaType) {
            let method = typeis.is(type, ['json', 'urlencoded', 'text', 'raw'])

            if (method) {
                return parse(method, req, res, contentTypes[mediaType]);
            } else if (   contentTypes.hasOwnProperty(mediaType)
                && typeof contentTypes[mediaType].parser === 'function'
            ) {
                return contentTypes[mediaType].parser(req);
            }
        }

        return null;
    }).then(function() {
        if (typeof req.body !== 'object' || typeof req.body === null) {
            req.body = {};
        }
        return null;
    });
};

/*
 * @private
 * body parser promise wrapper
 * @param {String} method
 * @param {Object} options
 * @return Promise
 */
function parse(method, req, res, options) {
    return new Promise(function(resolve, reject) {
        BodyParser[method](options)(req, res, function(err) {
            if (err) {
                return reject(err);
            }

            return resolve();
        });
    });
}