@bitblit/epsilon
Version:
Tiny adapter to simplify building API gateway Lambda APIS
88 lines • 4.19 kB
JavaScript
;
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var Validator = require("swagger-model-validator");
var fs = require("fs");
var yaml = require("js-yaml");
var logger_1 = require("@bitblit/ratchet/dist/common/logger");
var bad_request_error_1 = require("../error/bad-request-error");
/**
* Helper for validating endpoints
*/
var ModelValidator = /** @class */ (function () {
function ModelValidator(allModels) {
this.allModels = allModels;
if (!allModels || Object.keys(allModels).length == 0) {
throw new Error('Cannot create model validator, passed models was null/empty : ' + JSON.stringify(allModels));
}
}
ModelValidator.createFromOpenApiPath = function (pathToSwagger) {
var contents = fs.readFileSync(pathToSwagger);
return ModelValidator.createFromOpenApiYaml(contents.toString());
};
ModelValidator.createFromOpenApiYaml = function (yamlString) {
var openApi = yaml.load(yamlString);
return ModelValidator.createFromParsedOpenApiObject(openApi);
};
ModelValidator.createFromParsedOpenApiObject = function (openApi) {
if (!openApi || !openApi['components'] || !openApi['components']['schemas']) {
throw new Error('Cannot use this yaml - either null, or missing path components/schemas');
}
return new ModelValidator(openApi['components']['schemas']);
};
ModelValidator.prototype.addModel = function (modelName, model) {
this.allModels[modelName] = model;
};
ModelValidator.prototype.fetchModel = function (modelName) {
return this.allModels[modelName];
};
ModelValidator.prototype.validate = function (modelName, modelObject, emptyAllowed, extraPropertiesAllowed) {
if (emptyAllowed === void 0) { emptyAllowed = false; }
if (extraPropertiesAllowed === void 0) { extraPropertiesAllowed = true; }
var rval = [];
logger_1.Logger.silly('Validating model %s all definitions are : %j', modelName, this.allModels);
var modelEmpty = !modelObject || Object.keys(modelObject).length === 0;
if (modelEmpty) {
if (!emptyAllowed) {
rval.push('Empty / null object sent, but empty not allowed here');
}
}
else {
if (this.allModels && modelName && this.allModels[modelName]) {
var validation = new Validator().validate(modelObject, this.allModels[modelName], this.allModels, emptyAllowed, extraPropertiesAllowed);
if (validation.errorCount > 0) {
rval = validation.errors.map(function (e) { return e.message; });
}
}
else {
rval = ['Model named "' + modelName + '" not present in schema'];
}
}
return rval;
};
ModelValidator.prototype.validateBody = function (modelName, modelObject, emptyAllowed, extraPropertiesAllowed) {
if (emptyAllowed === void 0) { emptyAllowed = false; }
if (extraPropertiesAllowed === void 0) { extraPropertiesAllowed = true; }
var errors = this.validate(modelName, modelObject, emptyAllowed, extraPropertiesAllowed);
if (errors.length > 0) {
var errorStrings = errors.map(function (x) {
return String(x);
});
logger_1.Logger.info('Found errors while validating %s object %j', modelName, errorStrings);
var newError = new (bad_request_error_1.BadRequestError.bind.apply(bad_request_error_1.BadRequestError, __spreadArrays([void 0], errorStrings)))();
throw newError;
}
else {
return Promise.resolve(modelObject);
}
};
return ModelValidator;
}());
exports.ModelValidator = ModelValidator;
//# sourceMappingURL=model-validator.js.map