swagger-tools
Version:
Various tools for using and integrating with Swagger.
154 lines (124 loc) • 4.48 kB
JavaScript
/*
* The MIT License (MIT)
*
* Copyright (c) 2014 Apigee Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
;
/* This module contains code that is reused in more than one of the Swagger middlewares */
var _ = require('lodash-compat');
var helpers = require('../lib/helpers');
var parseurl = require('parseurl');
var qs = require('qs');
var isModelType = module.exports.isModelType = function (spec, type) {
return spec.primitives.indexOf(type) === -1;
};
var getParameterType = module.exports.getParameterType = function (schema) {
var type = schema.type;
if (!type && schema.schema) {
type = getParameterType(schema.schema);
}
if (!type) {
type = 'object';
}
return type;
};
var isModelParameter = module.exports.isModelParameter = function (version, param) {
var spec = helpers.getSpec(version);
var type = getParameterType(param);
var isModel = false;
if (type === 'object' || isModelType(spec, type)) {
isModel = true;
} else if (type === 'array' && isModelType(spec, param.items ?
param.items.type || param.items.$ref :
undefined)) {
isModel = true;
}
return isModel;
};
module.exports.getParameterValue = function (version, parameter, pathKeys, match, req, debug) {
var defaultVal = version === '1.2' ? parameter.defaultValue : parameter.default;
var paramLocation = version === '1.2' ? parameter.paramType : parameter.in;
var paramType = getParameterType(parameter);
var val;
// Get the value to validate based on the operation parameter type
switch (paramLocation) {
case 'body':
val = req.body;
break;
case 'form':
case 'formData':
if (paramType.toLowerCase() === 'file') {
val = req.files[parameter.name];
} else if (isModelParameter(version, parameter)) {
val = req.body;
} else {
val = req.body[parameter.name];
}
break;
case 'header':
val = req.headers[parameter.name.toLowerCase()];
break;
case 'path':
_.each(pathKeys, function (key, index) {
if (key.name === parameter.name) {
val = decodeURIComponent(match[index + 1]);
}
});
break;
case 'query':
val = req.query[parameter.name];
break;
}
debug(' Value provided: %s', !_.isUndefined(val));
// Use the default value when necessary
if (_.isUndefined(val) && !_.isUndefined(defaultVal)) {
val = defaultVal;
}
return val;
};
module.exports.parseQueryString = function(req) {
return req.url.indexOf('?') > -1 ? qs.parse(parseurl(req).query, {}) : {};
};
module.exports.debugError = function (err, debug) {
var reason = err.message.replace(/^.*validation failed: /, '');
reason = reason.charAt(0).toUpperCase() + reason.substring(1);
debug(' Reason: %s', reason);
if (err.failedValidation === true) {
if (err.results) {
debug(' Errors:');
_.each(err.results.errors, function (error, index) {
debug(' %d:', index);
debug(' code: %s', error.code);
debug(' message: %s', error.message);
debug(' path: %s', JSON.stringify(error.path));
});
}
}
if (err.stack) {
debug(' Stack:');
_.each(err.stack.split('\n'), function (line, index) {
// Skip the first line since it's in the reasonx
if (index > 0) {
debug(' %s', line);
}
});
}
};