41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
// Heavily based on:
|
|
// https://github.com/TomDoesTech/REST-API-Tutorial-Updated/blob/7b5f040e1acd94d267df585516b33ee7e3b75f70/src/middleware/validateResource.ts
|
|
import { Request, Response, NextFunction } from 'express';
|
|
import { ErrorDTO } from '../schemas/miscSchema';
|
|
import z from 'zod';
|
|
|
|
const validate =
|
|
(schema: z.ZodObject) =>
|
|
(req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
let validatedData = schema.parse({
|
|
body: req.body,
|
|
query: req.query,
|
|
params: req.params,
|
|
});
|
|
res.locals.validated = validatedData;
|
|
next();
|
|
} catch (e: any) {
|
|
if (e instanceof z.ZodError) {
|
|
let errorResponse: ErrorDTO = {
|
|
status: 'error',
|
|
error: e.issues[0]?.message ?? 'Unknown error',
|
|
code: e.issues[0]?.code
|
|
};
|
|
return res.status(400)
|
|
.json(errorResponse);
|
|
} else {
|
|
console.log('Generic validation error triggered:', e);
|
|
let errorResponse: ErrorDTO = {
|
|
status: 'error',
|
|
error: 'Unknown error',
|
|
code: 'generic-error'
|
|
};
|
|
return res.status(400)
|
|
.json(errorResponse);
|
|
}
|
|
|
|
}
|
|
};
|
|
|
|
export default validate; |