UNPKG

js-mvc-app

Version:

A CLI tool to scaffold complete Node.js MVC projects with TypeScript, just like Laravel

144 lines (125 loc) 4.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getValidationMiddleware = getValidationMiddleware; function getValidationMiddleware() { return `import { Request, Response, NextFunction } from 'express'; import Joi from 'joi'; import { logger } from '../utils/logger'; // Validation schemas const registerSchema = Joi.object({ name: Joi.string().trim().min(2).max(50).required().messages({ 'string.empty': 'Name is required', 'string.min': 'Name must be at least 2 characters long', 'string.max': 'Name cannot exceed 50 characters' }), email: Joi.string().email().required().messages({ 'string.empty': 'Email is required', 'string.email': 'Please provide a valid email address' }), password: Joi.string().min(6).required().messages({ 'string.empty': 'Password is required', 'string.min': 'Password must be at least 6 characters long' }) }); const loginSchema = Joi.object({ email: Joi.string().email().required().messages({ 'string.empty': 'Email is required', 'string.email': 'Please provide a valid email address' }), password: Joi.string().required().messages({ 'string.empty': 'Password is required' }) }); const authUpdateSchema = Joi.object({ name: Joi.string().trim().min(2).max(50).required().messages({ 'string.empty': 'Name is required', 'string.min': 'Name must be at least 2 characters long', 'string.max': 'Name cannot exceed 50 characters' }) }); const userUpdateSchema = Joi.object({ name: Joi.string().trim().min(2).max(50).required().messages({ 'string.empty': 'Name is required', 'string.min': 'Name must be at least 2 characters long', 'string.max': 'Name cannot exceed 50 characters' }), email: Joi.string().email().required().messages({ 'string.empty': 'Email is required', 'string.email': 'Please provide a valid email address' }) }); const passwordChangeSchema = Joi.object({ currentPassword: Joi.string().required().messages({ 'string.empty': 'Current password is required' }), newPassword: Joi.string().min(6).required().messages({ 'string.empty': 'New password is required', 'string.min': 'New password must be at least 6 characters long' }) }); // Generic validation middleware function validate(schema: Joi.ObjectSchema) { return (req: Request, res: Response, next: NextFunction): void => { const { error, value } = schema.validate(req.body, { abortEarly: false, allowUnknown: false, stripUnknown: true }); if (error) { const errorDetails = error.details.map(detail => ({ field: detail.path.join('.'), message: detail.message })); logger.warn('Validation error:', errorDetails); res.status(400).json({ error: 'Validation failed', details: errorDetails }); return; } req.body = value; next(); }; } // Specific validation middlewares export const validateRegister = validate(registerSchema); export const validateLogin = validate(loginSchema); export const validateAuth = validate(authUpdateSchema); export const validateUserUpdate = validate(userUpdateSchema); export const validatePasswordChange = validate(passwordChangeSchema); // Parameter validation export function validateObjectId(paramName: string = 'id') { return (req: Request, res: Response, next: NextFunction): void => { const id = req.params[paramName]; // For MongoDB ObjectId validation if (id && id.match(/^[0-9a-fA-F]{24}$/)) { next(); return; } // For SQL integer ID validation if (id && /^\d+$/.test(id)) { next(); return; } res.status(400).json({ error: \`Invalid \${paramName} format\` }); }; } // Query validation export function validatePagination(req: Request, res: Response, next: NextFunction): void { const page = parseInt(req.query.page as string) || 1; const limit = parseInt(req.query.limit as string) || 10; if (page < 1) { res.status(400).json({ error: 'Page must be a positive integer' }); return; } if (limit < 1 || limit > 100) { res.status(400).json({ error: 'Limit must be between 1 and 100' }); return; } req.query.page = page.toString(); req.query.limit = limit.toString(); next(); } `; } //# sourceMappingURL=validation.js.map