const sanitizer = require('sanitizer'); // Verifies a single property is well formed. // expected follows the format: // ex. {name: 'myList', type: 'array', maxLength: 10} // ex. {name: 'myVar', type: 'string', optional: true} const verify = async (prop, expected) => { if (!expected.optional && !prop) throw {code: 400, message: expected.name + ' not specified.'}; else if (!prop) return; if (expected.type) { if (expected.type === 'date') { if (isNaN(new Date(prop))) throw {code: 400, message: `${expected.name} malformed.`}; } else if (expected.type === 'array') { if (!(prop instanceof Array)) throw {code: 400, message: `${expected.name} malformed.`}; } else if (expected.type === 'number') { if (isNaN(parseInt(prop))) throw {code: 400, message: `${expected.name} malformed.`}; } else { if (typeof prop !== expected.type) throw {code: 400, message: `${expected.name} malformed.`}; } } if (expected.min && parseInt(prop) < expected.min) throw {code: 400, message: `${expected.name} too small.`}; if (expected.max && parseInt(prop) > expected.max) throw {code: 400, message: `${expected.name} too large.`}; if (expected.maxLength && prop.length > expected.maxLength) throw {code: 400, message: `${expected.name} too long.`}; if (expected.sanitize && sanitizer.sanitize(prop) !== prop) throw {code: 400, message: `${expected.name} contains invalid characters.`}; if (expected.restrict && prop.replace(expected.restrict, '') !== prop) throw {code: 400, message: `${expected.name} contains invalid characters.`}; }; module.exports = verify;