generator-swagapi
Version:
Yeoman generator for swagger-based express application.
206 lines (179 loc) • 5.41 kB
JavaScript
/*eslint quotes: [2, "single", "avoid-escape"]*/
;
var _ = require('lodash');
var _s = require('underscore.string');
var util = require('util');
var debug = util.debuglog('generator-swagapi');
var helpers = module.exports;
var refRegExp = /^#\/definitions\/(\w*)$/;
var pathParamRegExp = /^{.*}$/;
var simpleTypes = {
integer: 'Number',
long: 'Number',
float: 'Number',
double: 'Number',
number: 'Number',
string: 'String',
password: 'String',
boolean: 'Boolean',
date: 'Date',
dateTime: 'Date'
};
function getTestVal(property) {
var dtype = _.get(simpleTypes, property.type);
if (!dtype) {
return null;
}
if (dtype === 'Number') {
return 1;
}
if (dtype === 'Boolean') {
return true;
}
if (dtype === 'Date') {
return Date.now();
}
return 'helloworld';
}
function genSchemaData(schema) {
if (!schema || !schema.required) {
return null;
}
return _.mapValues(schema.properties, getTestVal);
}
helpers.makeTestData = function makeTestData(parameters, schemas) {
schemas = schemas || {};
if (!parameters || _.isEmpty(parameters)) {
return null;
}
var data = {};
_.forEach(parameters, function (param) {
if (param.in === 'body' && param.schema.$ref) {
data = genSchemaData(_.get(schemas, helpers.getPropertyRef(param.schema)));
}
});
if (_.isEmpty(data)) {
data = null;
}
return data;
};
helpers.getPropertyRef = function getPropertyRef(property) {
var refString;
if (_.get(property, '$ref')) {
refString = _.get(property, '$ref');
} else if (property.type === 'array' && _.get(property.items, '$ref')) {
refString = _.get(property.items, '$ref');
}
if (refString) {
return refString.match(refRegExp)[1];
}
return null;
};
helpers.getSchema = function getSchema(object, subSchema) {
var propType;
var props = {};
object = object || {};
subSchema = subSchema || {};
if (object.type === 'object') {
return helpers.getSchema(object.properties);
}
if (object.type === 'array') {
return [helpers.getSchema(object.items)];
}
if (object.type && _.has(simpleTypes, object.type)) {
return _.get(simpleTypes, object.type);
}
_.forEach(object, function (property, key) {
propType = helpers.getPropertyRef(property);
if (propType) {
if (subSchema[propType]) {
props[key] = [propType + 'Schema'];
} else {
props[key] = {
type: _s.quote('mongoose.Schema.Types.ObjectId'),
ref: _s.quote(propType)
};
}
// works like a continue loop
return;
}
props[key] = helpers.getSchema(property, subSchema);
});
return props;
};
helpers.formatObject = function formatObject(object, subSchema) {
return util.inspect(helpers.getSchema(object, subSchema)).replace(/'/g, '').replace(/"/g, "'");
};
helpers.getRespSchema = function getRespSchema(object) {
var refString;
var schemas = [];
_.forEach(object.methods, function (method) {
_.forEach(method.responses, function (resp, code) {
debug('checking response code: %s', code);
refString = helpers.getPropertyRef(resp.schema || {});
if (refString) {
schemas.push(refString);
}
});
});
debug(schemas);
return _.uniq(schemas);
};
helpers.getPathMetadata = function getPathMetadata(routePath) {
var totParam = 0;
var totPaths = 0;
var metadata = {
type: null,
subResource: null,
parentId: null,
id: null
};
_.compact(routePath.split('/')).forEach(function (element) {
if (pathParamRegExp.test(element)) {
element = element.replace(/{/g, '').replace(/}/g, '');
totParam += 1;
if (!metadata.id) {
metadata.id = element;
} else if (!metadata.parentId) {
metadata.parentId = metadata.id;
metadata.id = element;
}
} else {
totPaths += 1;
metadata.subResource = element;
}
});
if (totParam === 0 && totPaths > 0) {
metadata.type = 'Resources';
} else if (totParam === 1) {
if (totPaths === 1) {
metadata.type = 'Resource';
}
if (totPaths === 2) {
metadata.type = 'SubResources';
}
} else if (totParam === 2) {
metadata.type = 'SubResource';
}
debug('path metadata', metadata);
return metadata;
};
helpers.formatSuccessResponse = function formatSuccessResponse(responses, returnKey) {
var result = 'res.sendStatus(501);';
if (responses[200]) {
if (responses[200].schema) {
result = 'res.status(200).json(' + returnKey + ');';
} else {
result = 'res.sendStatus(200);';
}
} else if (responses[201]) {
if (responses[201].schema) {
result = 'res.status(201).json(' + returnKey + ');';
} else {
result = 'res.sendStatus(201);';
}
} else if (responses[204]) {
result = 'res.sendStatus(204);';
}
return result;
};