From 196604599b7d7bd752e3bf5739bbe60483b77b99 Mon Sep 17 00:00:00 2001 From: Stephan <57194608+stephan418@users.noreply.github.com> Date: Sun, 15 May 2022 11:46:53 +0200 Subject: [PATCH] FIX: **quickly** fix all errors in the media system --- Dockerfile | 2 + src/Controllers/media.controller.ts | 62 ++++++++++++++++++----------- src/Routes/media.routes.ts | 8 ++-- src/app.ts | 6 +-- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/Dockerfile b/Dockerfile index d4a542d..6fd1450 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,8 @@ COPY package.json package-lock.json /app/ # Change directory into the container WORKDIR /app +RUN mkdir /app/media + # Install dependencies RUN npm i -g typescript RUN npm i diff --git a/src/Controllers/media.controller.ts b/src/Controllers/media.controller.ts index 2083ef2..a1d86dc 100644 --- a/src/Controllers/media.controller.ts +++ b/src/Controllers/media.controller.ts @@ -7,10 +7,12 @@ import { Prisma } from "@prisma/client"; import prisma from "../lib/prisma"; import NotFoundError from "../Middleware/error/NotFoundError"; import { PrismaClientKnownRequestError } from "@prisma/client/runtime"; -import { generateInvalidBodyError, DataType, } from "./common"; +import { generateInvalidBodyError, DataType } from "./common"; import { type } from "os"; -import {unlink} from "fs/promises" +import { unlink } from "fs/promises"; +import ForwardableError from "../Middleware/error/ForwardableError"; +require("express-async-errors"); function createMediaLinks(fileName: string) { return [{ rel: "self", type: "GET", href: `/api/media/${fileName}` }]; @@ -25,6 +27,11 @@ export const uploadImage = async (req: Request, res: Response) => { return res.status(403).json(createInsufficientPermissionsError()); } + // REVIEW: This is only a **quick** fix (As the body is multipart form data, it cannot be used like this) + // @ts-ignore + req.body.description = "Sample image"; + console.log(req.body); + if (!req.files || !("file" in req.files)) { return res.json({ type: "error", @@ -39,10 +46,10 @@ export const uploadImage = async (req: Request, res: Response) => { }); } - if ( typeof req.body.description !== "string") { + if (typeof req.body.description !== "string") { return res.status(400).json( generateInvalidBodyError({ - description: DataType.STRING + description: DataType.STRING, }) ); } @@ -83,24 +90,30 @@ export const uploadImage = async (req: Request, res: Response) => { return res.status(409).json(createError("The uploaded file already exists", {}, createMediaLinks(fileName))); } - file.mv("media/" + fileName, console.error); + file.mv("/app/media/" + fileName, console.error); - //generate record - const media = await prisma.media.create({ - data: { - pid: fileName, - description: req.body.description, - }, - select: { - pid: true, - description: true, + try { + //generate record + const media = await prisma.media.create({ + data: { + pid: fileName, + description: req.body.description, + }, + select: { + pid: true, + description: true, + }, + }); + + return res.status(201).json({ + type: "success", + payload: { media }, + }); + } catch (e) { + if (e instanceof PrismaClientKnownRequestError && e.code === "P2002") { + throw new ForwardableError(409, `The image with the the hash and extenstion ${fileName} already exists!`); } - }) - - return res.status(201).json({ - type: "success", - payload: { media } - }) + } }; export const getAllMedia = async (req: Request, res: Response) => { @@ -139,7 +152,7 @@ interface MediaParams { } export const deleteMedia = async (req: Request, res: Response) => { - if (req.auth?.permission_level != "ELEVATED"){ + if (req.auth?.permission_level != "ELEVATED") { res.status(403).json(createInsufficientPermissionsError()); } @@ -149,16 +162,17 @@ export const deleteMedia = async (req: Request, res: Response) => { if (fs.existsSync(location)) { await unlink(location); + 1; } try { - await prisma.discipline.delete({ where: { pid }}); + await prisma.media.delete({ where: { pid } }); return res.status(204).end(); } catch (e) { if (e instanceof PrismaClientKnownRequestError && e.code === "P2025") { - throw new NotFoundError("discipline", pid); + throw new NotFoundError("media", pid); } throw e; } -}; \ No newline at end of file +}; diff --git a/src/Routes/media.routes.ts b/src/Routes/media.routes.ts index 9d781e5..9c9fa7b 100644 --- a/src/Routes/media.routes.ts +++ b/src/Routes/media.routes.ts @@ -5,12 +5,12 @@ import { deleteMedia, getAllMedia, uploadImage } from "../Controllers/media.cont const router = express.Router(); +// Media storage with express static (Should only handle GET and HEAD request methods) +router.use("/", express.static("/app/media", { redirect: false })); + router.post("/", requireAuthentication, fileUpload(), uploadImage); -// Media storage with express static (Should only handle GET and HEAD request methods) -router.use("/", express.static("media", { redirect: false })); - -router.get("/:pid", getAllMedia); +router.get("/", requireAuthentication, getAllMedia); // Reading all files should be a senstive operation router.delete("/:pid", requireAuthentication, deleteMedia); diff --git a/src/app.ts b/src/app.ts index 95bbc8b..ae0c0ec 100644 --- a/src/app.ts +++ b/src/app.ts @@ -60,11 +60,11 @@ async function main() { app.use("/api/role-schemas", roleSchemaRouter); - // Error handling - app.use(defaultErrorHandler); // Not working - app.use("/api/media", mediaRouter); + // Error handling + app.use(defaultErrorHandler); // This has to be the LAST ROUTE + // Disable the media router for now // app.use("/api/media", mediaRouter);