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
JavaScript
"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