@bodheesh/create-bodhi-node-app
Version:
Create a production-ready Node.js REST API with zero configuration
66 lines (62 loc) • 2.28 kB
text/typescript
import { Request, Response, NextFunction } from 'express';
import validate from '@bodhi/form-validations';
export const generateValidationMiddleware = (schema: any) => {
return (req: Request, res: Response, next: NextFunction) => {
try {
// Use isObject for form validation with schema
const validationResult = validate.isObject(req.body, {
requiredFields: Object.keys(schema).filter(key => schema[key].required),
fieldValidators: Object.entries(schema).reduce((acc: any, [field, rules]: [string, any]) => {
acc[field] = (value: any) => {
switch (rules.type) {
case 'string':
if (rules.format === 'email') {
return validate.isEmail(value);
} else if (rules.format === 'password') {
return validate.isStrongPassword(value, {
minLength: rules.minLength || 8,
requireUppercase: true,
requireNumbers: true
});
} else if (rules.format === 'phone') {
return validate.isPhone(value);
} else {
return validate.isUsername(value, {
minLength: rules.minLength,
maxLength: rules.maxLength
});
}
case 'number':
return validate.isNumber(value, {
min: rules.minimum,
max: rules.maximum,
precision: rules.precision
});
case 'date':
return validate.isDate(value, {
format: rules.format || 'YYYY-MM-DD',
minDate: rules.minimum,
maxDate: rules.maximum
});
default:
return { isValid: true, message: 'Valid' };
}
};
return acc;
}, {})
});
if (!validationResult.isValid) {
return res.status(400).json({
success: false,
errors: validationResult.errors
});
}
next();
} catch (error) {
return res.status(500).json({
success: false,
error: 'Validation error occurred'
});
}
};
};