Files
Church-Music/new-site/backend/middleware/validate.js

80 lines
1.9 KiB
JavaScript
Raw Normal View History

2026-01-27 18:04:50 -06:00
import { body, validationResult } from "express-validator";
export const validate = (validations) => {
return async (req, res, next) => {
await Promise.all(validations.map((validation) => validation.run(req)));
const errors = validationResult(req);
if (errors.isEmpty()) {
return next();
}
res.status(400).json({
error: "Validation Error",
details: errors.array().map((err) => ({
field: err.path,
message: err.msg,
})),
});
};
};
// Auth validations
export const loginValidation = [
body("email").isEmail().normalizeEmail().withMessage("Valid email required"),
body("password")
.isLength({ min: 6 })
.withMessage("Password must be at least 6 characters"),
];
export const registerValidation = [
body("name")
.trim()
.isLength({ min: 2 })
.withMessage("Name must be at least 2 characters"),
body("email").isEmail().normalizeEmail().withMessage("Valid email required"),
body("password")
.isLength({ min: 8 })
.withMessage("Password must be at least 8 characters")
.matches(/\d/)
.withMessage("Password must contain at least one number"),
];
// Song validations
export const songValidation = [
body("title").trim().notEmpty().withMessage("Title is required"),
body("key")
.optional()
.isIn([
"C",
"C#",
"Db",
"D",
"D#",
"Eb",
"E",
"F",
"F#",
"Gb",
"G",
"G#",
"Ab",
"A",
"A#",
"Bb",
"B",
]),
body("tempo")
.optional()
.isInt({ min: 40, max: 220 })
.withMessage("Tempo must be between 40 and 220"),
body("lyrics").optional().isString(),
];
// List validations
export const listValidation = [
body("name").trim().notEmpty().withMessage("Name is required"),
body("date").optional().isISO8601().withMessage("Valid date required"),
body("songs").optional().isArray(),
];