Drizzle-zod for validation - part1
This commit is contained in:
23
api/package-lock.json
generated
23
api/package-lock.json
generated
@@ -10,8 +10,10 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"drizzle-orm": "^0.44.2",
|
"drizzle-orm": "^0.44.2",
|
||||||
|
"drizzle-zod": "^0.8.2",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"mysql2": "^3.14.1"
|
"mysql2": "^3.14.1",
|
||||||
|
"zod": "^3.25.74"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^5.0.3",
|
"@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": {
|
"node_modules/dunder-proto": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
"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",
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||||
"license": "ISC"
|
"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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,14 @@
|
|||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"db:generate": "drizzle-kit generate",
|
"db:generate": "drizzle-kit generate",
|
||||||
"db:migrate": "drizzle-kit migrate",
|
"db:migrate": "drizzle-kit migrate",
|
||||||
"db:studio" : "drizzle-kit studio"
|
"db:studio": "drizzle-kit studio"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"drizzle-orm": "^0.44.2",
|
"drizzle-orm": "^0.44.2",
|
||||||
|
"drizzle-zod": "^0.8.2",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"mysql2": "^3.14.1"
|
"mysql2": "^3.14.1",
|
||||||
|
"zod": "^3.25.74"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^5.0.3",
|
"@types/express": "^5.0.3",
|
||||||
|
|||||||
20
api/src/middlewares/validationMiddleware.ts
Normal file
20
api/src/middlewares/validationMiddleware.ts
Normal 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' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -5,13 +5,25 @@ import { listProducts,
|
|||||||
updateProduct,
|
updateProduct,
|
||||||
deleteProduct
|
deleteProduct
|
||||||
} from "./productsController";
|
} 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();
|
const router = Router();
|
||||||
|
|
||||||
// products endpoints where validator can be added later
|
// products endpoints where validator can be added later
|
||||||
router.get('/', listProducts);
|
router.get('/', listProducts);
|
||||||
router.get('/:id', getProductById);
|
router.get('/:id', getProductById);
|
||||||
router.post('/', createProduct);
|
router.post('/', validateData(createProductSchema), createProduct);
|
||||||
router.put('/:id', updateProduct);
|
router.put('/:id', updateProduct);
|
||||||
router.delete('/:id', deleteProduct);
|
router.delete('/:id', deleteProduct);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user