@jsstudio/development-api-interceptor
Version:
development-api-interceptor
104 lines • 4.94 kB
JavaScript
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