import { Request, Response, NextFunction } from 'express'; import Joi from 'joi'; import { AppError } from '../utils/AppError'; export const validate = (schema: Joi.ObjectSchema) => { return (req: Request, res: Response, next: NextFunction): void => { const { error } = schema.validate(req.body, { abortEarly: false }); if (error) { const errorMessage = error.details.map(detail => detail.message).join(', '); return next(new AppError(errorMessage, 400)); } next(); }; }; // Common validation schemas export const registerSchema = Joi.object({ username: Joi.string() .min(3) .max(30) .required() .messages({ 'string.min': 'Username must be at least 3 characters long', 'string.max': 'Username cannot exceed 30 characters', 'any.required': 'Username is required' }), email: Joi.string() .email() .required() .messages({ 'string.email': 'Please provide a valid email address', 'any.required': 'Email is required' }), password: Joi.string() .min(8) .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/) .required() .messages({ 'string.min': 'Password must be at least 8 characters long', 'string.pattern.base': 'Password must contain at least one lowercase letter, one uppercase letter, one number, and one special character', 'any.required': 'Password is required' }) }); export const loginSchema = Joi.object({ email: Joi.string() .email() .required() .messages({ 'string.email': 'Please provide a valid email address', 'any.required': 'Email is required' }), password: Joi.string() .required() .messages({ 'any.required': 'Password is required' }) }); export const forgotPasswordSchema = Joi.object({ email: Joi.string() .email() .required() .messages({ 'string.email': 'Please provide a valid email address', 'any.required': 'Email is required' }) }); export const resetPasswordSchema = Joi.object({ token: Joi.string() .required() .messages({ 'any.required': 'Reset token is required' }), newPassword: Joi.string() .min(8) .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/) .required() .messages({ 'string.min': 'Password must be at least 8 characters long', 'string.pattern.base': 'Password must contain at least one lowercase letter, one uppercase letter, one number, and one special character', 'any.required': 'New password is required' }) });