import express from "express"; import { dinosaurIdParamSchema, dinosaurBodySchema } from "../validation/dinosaurSchemas.js"; import { dinosaurRepository } from "../repositories/dinosaurRepository.js"; export const dinosaurRouter = express.Router(); const formatValidationErrors = (issues) => { return issues.map((issue) => ({ field: issue.path.join("."), message: issue.message, })); }; // Return all dinosaurs through the repository abstraction. dinosaurRouter.get("/dinosaurs", async (_request, response) => { const dinosaurs = await dinosaurRepository.listDinosaurs(); response.json(dinosaurs); }); // Return one dinosaur identified by a positive integer ID. dinosaurRouter.get("/dinosaurs/:id", async (request, response) => { const parsedParams = dinosaurIdParamSchema.safeParse(request.params); if (!parsedParams.success) { return response.status(400).json({ message: "Dinosaur ID must be a positive integer", errors: formatValidationErrors(parsedParams.error.issues), }); } const { id } = parsedParams.data; const dinosaur = await dinosaurRepository.getDinosaurById(id); if (dinosaur === null) { return response.status(404).json({ message: "Dinosaur not found", }); } response.json(dinosaur); }); // Insert one dinosaur into the database. dinosaurRouter.post("/dinosaurs", async (request, response) => { const parsedBody = dinosaurBodySchema.safeParse(request.body); if (!parsedBody.success) { return response.status(400).json({ message: "Invalid dinosaur payload", errors: formatValidationErrors(parsedBody.error.issues), }); } const id = await dinosaurRepository.createDinosaur(parsedBody.data); response.status(201).json({ id }); }); // Replace one dinosaur identified by a positive integer ID. dinosaurRouter.put("/dinosaurs/:id", async (request, response) => { const parsedParams = dinosaurIdParamSchema.safeParse(request.params); if (!parsedParams.success) { return response.status(400).json({ message: "Dinosaur ID must be a positive integer", errors: formatValidationErrors(parsedParams.error.issues), }); } const parsedBody = dinosaurBodySchema.safeParse(request.body); if (!parsedBody.success) { return response.status(400).json({ message: "Invalid dinosaur payload", errors: formatValidationErrors(parsedBody.error.issues), }); } const updated = await dinosaurRepository.updateDinosaurById(parsedParams.data.id, parsedBody.data); if (!updated) { return response.status(404).json({ message: "Dinosaur not found", }); } response.sendStatus(204); }); // Delete one dinosaur identified by a positive integer ID. dinosaurRouter.delete("/dinosaurs/:id", async (request, response) => { const parsedParams = dinosaurIdParamSchema.safeParse(request.params); if (!parsedParams.success) { return response.status(400).json({ message: "Dinosaur ID must be a positive integer", errors: formatValidationErrors(parsedParams.error.issues), }); } const deleted = await dinosaurRepository.deleteDinosaurById(parsedParams.data.id); if (!deleted) { return response.status(404).json({ message: "Dinosaur not found", }); } response.sendStatus(204); });