UNPKG

wett

Version:

wett is a api layer between user api and db. provinding inbuilt user authentication via jwt and a db layer module to easily use multiple db with common functions

302 lines (241 loc) 10.1 kB
module.exports = { json:json, email:checkEmail }; function error(a,t,e){ return { all:a, tag:t, error:e } } function json(schema,data,schema_type,maxSize,returnError){ //if no type or maxSize is given static type and max size of 21 is automatically assumed if(!schema_type){schema_type = 'static'} if(schema_type == 'dynamic' && !maxSize){maxSize = 21;} //check schema if(!schema || typeof(schema) !== 'object' || Object.keys(schema).length == 0){ if(returnError){return error(true,null,'not_found-valid_schema');} return engine.common.error('not_found-valid_schema'); } //check data if(!data || typeof(data) !== 'object' || Object.keys(data).length == 0){ if(returnError){return error(true,null,'not_found-valid_data');} return engine.common.error('not_found-valid_data'); } let keys_schema = Object.keys(schema); let keys_data = Object.keys(data); //check size of both objects if(schema_type == 'static'){ if(keys_schema.length !== keys_data.length){ if(returnError){return error(true,null,'miss_matched-object_size');} return engine.common.error('miss_matched-object_size'); } } //check data object keys size if maxSize property is set if(schema_type == 'dynamic' && maxSize){ if(keys_data.length > maxSize){ if(returnError){return error(true,null,'max_limit_reached-data_size');} return engine.common.error('max_limit_reached-data_size'); } } //add any further data types first let dataTypes = ['object','array','string','number','email','boolean']; const defaultStrLen = 255; //loop the schema and check the data for(let key in schema){ const item = schema[key]; //check shcema item type if(typeof(item) !== 'object'){ if(returnError){return error(false,key,'invalid-schema_item_type');} return engine.common.error('invalid-schema_item_type-' + key); break; } //check if schema item have been declared if(!item.type || dataTypes.indexOf(item.type) < 0){ if(returnError){return error(false,key,'not_found/invalid-schema_item_type');} return engine.common.error('not_found/invalid-schema_item_type-' + key); break; } let type = item.type, needed = true, present = false; //check if the item is elective if(item.elective && item.elective == true){ if(schema_type == 'static'){ if(returnError){return error(false,key,'invalid-elective_item_in_static_schema-schema_key_in_data');} return engine.common.error('invalid-elective_item_in_static_schema-schema_key_in_data-' + key); break; } else { needed = false; } } //check if schema key exists in data if(needed == true && data.hasOwnProperty(key) == false){ if(returnError){return error(false,key,'not_found-schema_key_in_data');} return engine.common.error('not_found-schema_key_in_data-' + key); break; } //check if static data exists if(data.hasOwnProperty(key) == true && data[key] !== undefined && data[key] !== null){ present = true; } //check if the data value is not false for non boolean keys if(present && type !== 'boolean' && data[key] === false){ present = false; } //check if the data is needed and present if(present == false && needed == true){ if(returnError){return error(false,key,'not_found-data-data_type_for_key');} return engine.common.error('not_found-data-data_type_for_key-' + key); break; } //check if data type is valid if(present == true && type !== 'email' && checkType(data[key]) !== type){ if(returnError){return error(false,key,'invalid-data_type_for_key');} return engine.common.error('invalid-data_type_for_key-' + key); break; } //check the array and string length for schema key in data if((type == 'array' || type == 'string') && present == true){ if(!data[key]){ if(returnError){return error(false,key,'not_found-data-schema_key_in_data');} return engine.common.error('not_found-data-schema_key_in_data-' + key); break; } if(item.min && data[key].length < item.min){ if(returnError){return error(false,key,'min_length_reached-schema_key_in_data');} return engine.common.error('min_length_reached-schema_key_in_data-' + key); break; } if(item.max && data[key].length > item.max){ if(returnError){return error(false,key,'max_length_reached-schema_key_in_data');} return engine.common.error('max_length_reached-schema_key_in_data-' + key); break; } else if(!item.max && type == 'string' && data[key].length > defaultStrLen){ if(returnError){return error(false,key,'default_max_length_reached-schema_key_in_data');} return engine.common.error('default_max_length_reached-schema_key_in_data-' + key); break; } //check if the key is a valid option if(type == 'string'){ if(item.options && checkType(item.options)){ if(item.options.indexOf(data[key]) < 0){ if(returnError){return error(false,key,'invalid_option-schema_key_in_data');} return engine.common.error('invalid_option-schema_key_in_data-' + key); break; } } } } //check the number for schema key in data if(type == 'number' && present == true){ if(data[key] !== 0 && !data[key]){ if(returnError){return error(false,key,'not_found-data-schema_key_in_data');} return engine.common.error('not_found-data-schema_key_in_data-' + key); break; } if(item.min && data[key] < item.min){ if(returnError){return error(false,key,'min_length_reached-schema_key_in_data');} return engine.common.error('min_length_reached-schema_key_in_data-' + key); break; } if(item.max && data[key] > item.max){ if(returnError){return error(false,key,'max_length_reached-schema_key_in_data');} return engine.common.error('max_length_reached-schema_key_in_data-' + key); break; } } //check the object key size for schema key in data if(type == 'object' && present == true){ if(data[key] == false){ if(returnError){return error(false,key,'not_found-data-schema_key_in_data');} return engine.common.error('not_found-data-schema_key_in_data-' + key); break; } if(item.min && Object.keys(data[key]).length < item.min){ if(returnError){return error(false,key,'min_length_reached-schema_key_in_data');} return engine.common.error('min_length_reached-schema_key_in_data-' + key); break; } if(item.max && Object.keys(data[key]).length > item.max){ if(returnError){return error(false,key,'max_length_reached-schema_key_in_data');} return engine.common.error('max_length_reached-schema_key_in_data-' + key); break; } if(item.validate && typeof(item.validate) === "object" && item.validate.hasOwnProperty('schema')){ let checkSchema = json(item.validate.schema,data[key],item.validate.dynamic,item.validate.maxSize,item.validate.returnError); if(!checkSchema){ if(returnError && item.validate.returnError){return error(false,key,'failed-object_schema_check-schema_key_in_data-'+key);} return engine.common.error('failed-object_schema_check-schema_key_in_data-' + key); break; } } } //check the boolean data type if(type == 'boolean' && present == true){ if(data[key] !== true && data[key] !== false){ if(returnError){return error(false,key,'invalid-invalid_data-expected_boolean');} return engine.common.error('invalid-invalid_data-expected_boolean' + key); break; } } //check email and email string length for schema key in data if(type == 'email' && present == true){ if(checkType(data[key]) !== 'string'){ if(returnError){return error(false,key,'invalid-schema_key_in_data');} return engine.common.error('invalid-schema_key_in_data-' + key); break; } if(item.min && Object.keys(data[key]).length < item.min){ if(returnError){return error(false,key,'min_length_reached-schema_key_in_data');} return engine.common.error('min_length_reached-schema_key_in_data-' + key); break; } if(item.max && Object.keys(data[key]).length > item.max){ if(returnError){return error(false,key,'max_length_reached-schema_key_in_data');} return engine.common.error('max_length_reached-schema_key_in_data-' + key); break; } if(checkEmail(data[key]) == false){ if(returnError){return error(false,key,'invalid-email_key');} return engine.common.error('invalid-email_key-' + key); break; } } } //loop ends here //final functional return return true; } function checkType(data){ if(data == undefined || data == null){ return data; } let base = typeof(data); if(base == 'object'){ if(data instanceof Array){ return 'array'; } if(data instanceof Object){ return 'object'; } } if(base == 'string' || base == 'number'){ return base; } if(data == false || data == true){ return 'boolean'; } return null; } function checkEmail(mail){ let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; let test = re.test(String(mail).toLowerCase()); if(test == true){ return true; } else { return false; } }