110 lines
3.1 KiB
JavaScript
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);
|
|
});
|