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

23
api/package-lock.json generated
View File

@@ -10,8 +10,10 @@
"license": "ISC",
"dependencies": {
"drizzle-orm": "^0.44.2",
"drizzle-zod": "^0.8.2",
"express": "^5.1.0",
"mysql2": "^3.14.1"
"mysql2": "^3.14.1",
"zod": "^3.25.74"
},
"devDependencies": {
"@types/express": "^5.0.3",
@@ -1297,6 +1299,16 @@
}
}
},
"node_modules/drizzle-zod": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/drizzle-zod/-/drizzle-zod-0.8.2.tgz",
"integrity": "sha512-9Do/16OjFFNrQDZgvMtxtDDwKWbFOxUAIwNPKX98SfxrP8H18vhN1BvNXbhelLcdgCE7GEaXDJqBjMExSkhpkA==",
"license": "Apache-2.0",
"peerDependencies": {
"drizzle-orm": ">=0.36.0",
"zod": "^3.25.1"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -2214,6 +2226,15 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/zod": {
"version": "3.25.74",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.74.tgz",
"integrity": "sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
}
}
}

View File

@@ -12,12 +12,14 @@
"build": "tsc",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:studio" : "drizzle-kit studio"
"db:studio": "drizzle-kit studio"
},
"dependencies": {
"drizzle-orm": "^0.44.2",
"drizzle-zod": "^0.8.2",
"express": "^5.1.0",
"mysql2": "^3.14.1"
"mysql2": "^3.14.1",
"zod": "^3.25.74"
},
"devDependencies": {
"@types/express": "^5.0.3",

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);