import { Router } from "@oak/oak"; import { APIErrorCode, APIException, type APIResponse, type Dump, isCreateDumpRequest, isUpdateDumpRequest, } from "../model/interfaces.ts"; import { authMiddleware } from "../middleware/auth.ts"; import { createDump, deleteDump, getDump, listDumps, updateDump, } from "../services/dump-service.ts"; const router = new Router({ prefix: "/api/dumps" }); router.post( "/", authMiddleware, async (ctx) => { const createDumpRequest = await ctx.request.body.json(); if (!isCreateDumpRequest(createDumpRequest)) { throw new APIException( APIErrorCode.VALIDATION_ERROR, 400, "Invalid dump data", ); } const userId = ctx.state.user.userId; const dump = createDump(createDumpRequest, userId); const responseBody: APIResponse = { success: true, data: dump, }; ctx.response.status = 201; ctx.response.body = responseBody; }, ); router.get("/:dumpId", (ctx) => { const dumpId = ctx.params.dumpId; const dump = getDump(dumpId); const responseBody: APIResponse = { success: true, data: dump, }; ctx.response.body = responseBody; }); router.get("/", (ctx) => { const dumps = listDumps(); const responseBody: APIResponse = { success: true, data: dumps, }; ctx.response.body = responseBody; }); router.put("/:dumpId", authMiddleware, async (ctx) => { const dumpId = ctx.params.dumpId; const userId = ctx.state.user?.userId; const updateDumpRequest = await ctx.request.body.json(); if (!isUpdateDumpRequest(updateDumpRequest)) { throw new APIException( APIErrorCode.VALIDATION_ERROR, 422, "Erroneous user input", ); } const dump = getDump(dumpId); if (userId !== dump.userId) { throw new APIException( APIErrorCode.UNAUTHORIZED, 401, "Not authorized to update dump", ); } const updatedDump = updateDump(dumpId, updateDumpRequest); const responseBody: APIResponse = { success: true, data: updatedDump, }; ctx.response.body = responseBody; }); router.delete("/:dumpId", authMiddleware, (ctx) => { const dumpId = ctx.params.dumpId; const userId = ctx.state.user?.userId; const dump = getDump(dumpId); if (userId !== dump.userId) { throw new APIException( APIErrorCode.UNAUTHORIZED, 401, "Not authorized to update dump", ); } deleteDump(dumpId); const responseBody: APIResponse = { success: true, data: null, }; ctx.response.body = responseBody; }); export default router;