UNPKG

@bitblit/epsilon

Version:

Tiny adapter to simplify building API gateway Lambda APIS

88 lines 4.19 kB
"use strict"; 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