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