UNPKG

@jsstudio/development-api-interceptor

Version:
109 lines 5.54 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = __importDefault(require("lodash")); const data_types_1 = require("../../config/data-types"); const constants_1 = require("../../constants"); const error_handling_1 = require("../../error-handling"); const json_schema_1 = __importDefault(require("../../utils/json-schema")); class PayLoad { constructor(method) { this.method = method.toLowerCase(); } /** * Validate request payload. * * @param {Request} request - request received from url. * @param {string} tableName - Table name. * @returns {void } */ validate(request, tableName) { const jsonData = json_schema_1.default.get(); const tableObject = lodash_1.default.find(jsonData.tables, (e) => e.table_name === tableName); this.checkAdditionalProperties(tableObject, request); this.checkPrimaryKey(tableObject, tableName); this.checkRequiredColumns(tableObject, request); this.checkDataTypes(tableObject, request); } checkRequiredColumns(tableObject, request) { const requiredColumnsObj = lodash_1.default.filter(tableObject.columns, { constraints: { NOT_NULL: true } }); const requiredColumnNames = lodash_1.default.map(this.filterRequiredEntities(requiredColumnsObj), constants_1.ENTITY_NAME); const isRequiredFields = lodash_1.default.difference(requiredColumnNames, Object.keys(request)); if (isRequiredFields.length !== 0) { throw new error_handling_1.ApiError(`Required field(s): ${isRequiredFields.join(', ')} missing in request payload`, constants_1.RESPONSE_CODE.INVALID_INPUT); } } /** * Check NOT NULL for auto increment column . * * @param {Column} requiredColumnsObj - column object. * @returns { Column } requiredColumnsObj */ filterRequiredEntities(requiredColumnsObj) { var _a; const primaryColumnIndex = lodash_1.default.findIndex(requiredColumnsObj, { constraints: { PRIMARY_KEY: true } }); if (requiredColumnsObj[primaryColumnIndex] && ((_a = requiredColumnsObj[primaryColumnIndex].constraints) === null || _a === void 0 ? void 0 : _a.AUTO_INCREMENT)) { return requiredColumnsObj.splice(primaryColumnIndex, 0); } if (requiredColumnsObj[primaryColumnIndex] && this.method === constants_1.HttpMethods.PUT) { return requiredColumnsObj.splice(primaryColumnIndex, 0); } return requiredColumnsObj; } /** * Check if PRIMARY KEY present in schema . * * @param {Table} tableObject - request received from url. * @param {string} tableName - request received from url. * @returns { void } . */ checkPrimaryKey(tableObject, tableName) { const primaryColumnIndex = lodash_1.default.findIndex(tableObject.columns, { constraints: { PRIMARY_KEY: true, NOT_NULL: true } }); if (primaryColumnIndex === -1) { throw new error_handling_1.ApiError(`PRIMARY_KEY or NOT_NULL property in ${tableName} table schema is null`, constants_1.RESPONSE_CODE.INVALID_INPUT); } } /** * Check for additional columns . * * @param {Table} tableObject - request received from url. * @param {object} request - request received from url. * @returns { void } . */ checkAdditionalProperties(tableObject, request) { Object.keys(request).forEach((key) => { if (lodash_1.default.findIndex(tableObject.columns, { entity_name: key }) === -1) { throw new error_handling_1.ApiError(`${key} not present in schema`, constants_1.RESPONSE_CODE.INVALID_INPUT); } }); } checkDataTypes(tableObject, request) { for (const [key, value] of Object.entries(request)) { const columnObj = lodash_1.default.find(tableObject.columns, { entity_name: key }); const columnType = columnObj === null || columnObj === void 0 ? void 0 : columnObj.type; const validatorFunc = this.getDataValidator(columnType); const isValid = validatorFunc(value); if (!isValid) { throw new error_handling_1.ApiError(`${columnObj === null || columnObj === void 0 ? void 0 : columnObj.entity_name} is not of type ${columnObj === null || columnObj === void 0 ? void 0 : columnObj.type}`, constants_1.RESPONSE_CODE.INVALID_INPUT); } if ((columnObj === null || columnObj === void 0 ? void 0 : columnObj.constraints) && columnObj.constraints.MAX_LENGTH) { this.checkMaxLength(columnObj, value); } } } getDataValidator(type) { return data_types_1.DATA_TYPES[type]; } checkMaxLength(columnObj, value) { const constraints = columnObj.constraints; if (typeof value === constants_1.DATA_TYPE.STRING && constraints.MAX_LENGTH && !(value.length <= constraints.MAX_LENGTH)) { throw new error_handling_1.ApiError(`${columnObj.entity_name} is greater than Max length`, constants_1.RESPONSE_CODE.INVALID_INPUT); } } checkRequest(payLoad) { if (!payLoad) { throw new error_handling_1.ApiError(constants_1.ERRORS.REQUEST_BODY_MISSING, constants_1.RESPONSE_CODE.BAD_REQUEST); } } } exports.default = PayLoad; //# sourceMappingURL=Payload.js.map