- Full grant strategy framework for renewable energy & green hydrogen - AI-powered grant studio, partner outreach, financial modeling - Umami analytics with data-performance tracking - Live Degelas metrics connected to solar.degelas.be - Trilingual (EN/FR/AR) with i18n support - Dockerized with Nginx frontend + Express API proxy
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import type { Request, Response, NextFunction } from "express";
|
|
import { z } from "zod";
|
|
|
|
/**
|
|
* Request validation middleware factory.
|
|
* Validates req.body against a Zod schema.
|
|
* Returns 400 with validation errors if invalid.
|
|
*/
|
|
|
|
export function validateBody<T extends z.ZodType>(schema: T) {
|
|
return (req: Request, res: Response, next: NextFunction) => {
|
|
const result = schema.safeParse(req.body);
|
|
if (!result.success) {
|
|
return res.status(400).json({
|
|
ok: false,
|
|
error: "Invalid request body",
|
|
details: result.error.issues.map((e) => ({
|
|
path: e.path.join("."),
|
|
message: e.message,
|
|
})),
|
|
});
|
|
}
|
|
next();
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Query parameter validation middleware factory.
|
|
*/
|
|
export function validateQuery<T extends z.ZodType>(schema: T) {
|
|
return (req: Request, res: Response, next: NextFunction) => {
|
|
const result = schema.safeParse(req.query);
|
|
if (!result.success) {
|
|
return res.status(400).json({
|
|
ok: false,
|
|
error: "Invalid query parameters",
|
|
details: result.error.issues.map((e) => ({
|
|
path: e.path.join("."),
|
|
message: e.message,
|
|
})),
|
|
});
|
|
}
|
|
next();
|
|
};
|
|
}
|