UNPKG

@jsstudio/development-api-interceptor

Version:
104 lines 4.94 kB
import _ from 'lodash'; import { DATA_TYPES } from '../../config/data-types'; import { DATA_TYPE, ENTITY_NAME, ERRORS, HttpMethods, RESPONSE_CODE } from '../../constants'; import { ApiError } from '../../error-handling'; import jsonSchemaObject from '../../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 = jsonSchemaObject.get(); const tableObject = _.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 = _.filter(tableObject.columns, { constraints: { NOT_NULL: true } }); const requiredColumnNames = _.map(this.filterRequiredEntities(requiredColumnsObj), ENTITY_NAME); const isRequiredFields = _.difference(requiredColumnNames, Object.keys(request)); if (isRequiredFields.length !== 0) { throw new ApiError(`Required field(s): ${isRequiredFields.join(', ')} missing in request payload`, 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 = _.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 === 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 = _.findIndex(tableObject.columns, { constraints: { PRIMARY_KEY: true, NOT_NULL: true } }); if (primaryColumnIndex === -1) { throw new ApiError(`PRIMARY_KEY or NOT_NULL property in ${tableName} table schema is null`, 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 (_.findIndex(tableObject.columns, { entity_name: key }) === -1) { throw new ApiError(`${key} not present in schema`, RESPONSE_CODE.INVALID_INPUT); } }); } checkDataTypes(tableObject, request) { for (const [key, value] of Object.entries(request)) { const columnObj = _.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 ApiError(`${columnObj === null || columnObj === void 0 ? void 0 : columnObj.entity_name} is not of type ${columnObj === null || columnObj === void 0 ? void 0 : columnObj.type}`, 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[type]; } checkMaxLength(columnObj, value) { const constraints = columnObj.constraints; if (typeof value === DATA_TYPE.STRING && constraints.MAX_LENGTH && !(value.length <= constraints.MAX_LENGTH)) { throw new ApiError(`${columnObj.entity_name} is greater than Max length`, RESPONSE_CODE.INVALID_INPUT); } } checkRequest(payLoad) { if (!payLoad) { throw new ApiError(ERRORS.REQUEST_BODY_MISSING, RESPONSE_CODE.BAD_REQUEST); } } } export default PayLoad; //# sourceMappingURL=Payload.js.map