Drizzle-zod for validation - part1

This commit is contained in:
Justin xzHome
2025-07-06 22:38:21 +09:00
parent 4f0646dd2a
commit 4f35ed1abd
4 changed files with 59 additions and 4 deletions

View File

@@ -0,0 +1,20 @@
import { Request, Response, NextFunction } from 'express';
import { z, ZodError } from 'zod';
export function validateData(schema: z.ZodObject<any, any>) {
return (req: Request, res: Response, next: NextFunction) => {
try {
schema.parse(req.body);
next();
} catch (error) {
if (error instanceof ZodError) {
const errorMessages = error.errors.map((issue: any) => ({
message: `${issue.path.join('.')} is ${issue.message}`,
}));
res.status(400).json({ error: 'Invalid data', details: errorMessages });
} else {
res.status(500).json({ error: 'Internal Server Error' });
}
}
};
}

View File

@@ -5,13 +5,25 @@ import { listProducts,
updateProduct,
deleteProduct
} from "./productsController";
import { validateData } from "../../middlewares/validationMiddleware";
import { z } from 'zod';
import { createInsertSchema , createSelectSchema, createUpdateSchema } from 'drizzle-zod';
import { productsTable } from "../../db/productsSchema";
const createProductSchema = z.object({
name: z.string(),
price: z.number({ message: "not a number you idiot."}),
});
// const createProductSchema = createInsertSchema(productsTable);
// type ProductType = z.infer<typeof createProductSchema>;
const router = Router();
// products endpoints where validator can be added later
router.get('/', listProducts);
router.get('/:id', getProductById);
router.post('/', createProduct);
router.post('/', validateData(createProductSchema), createProduct);
router.put('/:id', updateProduct);
router.delete('/:id', deleteProduct);