rg_backend_academy/lecture_5/dinosaurs/src/routes/dinosaurRoutes.js

110 lines
3.1 KiB
JavaScript

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