From 13d6f881eaab21307b859df72992d59e41f343bf Mon Sep 17 00:00:00 2001 From: Stephan <57194608+stephan418@users.noreply.github.com> Date: Mon, 3 Jan 2022 23:00:48 +0100 Subject: [PATCH] Extract shared error code + Create new functions for generating errors --- src/Controllers/common.ts | 15 +++++++ src/Controllers/media.controller.ts | 64 ++++++++--------------------- 2 files changed, 32 insertions(+), 47 deletions(-) diff --git a/src/Controllers/common.ts b/src/Controllers/common.ts index ad2dc49..0b97e88 100644 --- a/src/Controllers/common.ts +++ b/src/Controllers/common.ts @@ -3,6 +3,21 @@ import { PrismaClientKnownRequestError, PrismaClientUnknownRequestError } from " import { Request, Response } from "express"; import prisma from "../lib/prisma"; +interface StringIndexedObject { + [k: string]: any; +} + +export function createError(message: string, payload: StringIndexedObject = {}, links: StringIndexedObject = {}) { + return { + type: "error", + payload: { + message: message, + ...payload, + }, + _links: links, + }; +} + export enum DataType { STRING = "string", NUMBER = "number", diff --git a/src/Controllers/media.controller.ts b/src/Controllers/media.controller.ts index 97b246b..c19314c 100644 --- a/src/Controllers/media.controller.ts +++ b/src/Controllers/media.controller.ts @@ -2,25 +2,19 @@ import { Request, Response } from "express"; import fs from "fs"; import isSvg from "is-svg"; import { fromBuffer as fileTypeFromBuffer } from "file-type"; +import { AUTH_ERROR, createError, createInsufficientPermissionsError } from "./common"; + +function createMediaLinks(fileName: string) { + return [{ rel: "self", type: "GET", href: `/api/media/${fileName}` }]; +} export const uploadImage = async (req: Request, res: Response) => { if (!req.auth?.isAuthenticated) { - return res.status(500).json({ - type: "failure", - payload: { - message: "The server was not able to validate your credentials; Please try again later", - }, - }); + return res.status(500).json(AUTH_ERROR); } if (!(req.auth.permission_level === "ELEVATED")) { - return res.status(403).json({ - type: "error", - payload: { - message: "You do not have sufficient permissions to use this feature", - required_level: "ELEVATED", - }, - }); + return res.status(403).json(createInsufficientPermissionsError()); } if (!req.files || !("file" in req.files)) { @@ -50,13 +44,7 @@ export const uploadImage = async (req: Request, res: Response) => { if (file.size > 1024 * 1024) { // Maybe resize (express-fileupload seems to support this) - return res.status(413).json({ - type: "error", - payload: { - message: "The uploaded image is too large", - max_size: "1 MB", - }, - }); + return res.status(413).json(createError("The uploaded image is too large", { max_size: "1 MB" })); } const fileIsSvg = isSvg(file.data); @@ -64,31 +52,19 @@ export const uploadImage = async (req: Request, res: Response) => { if (!(fileType && ["image/jpeg", "image/png"].includes(fileType.mime))) { if (!fileIsSvg) - return res.status(415).json({ - type: "error", - payload: { - message: - "The uploaded image does not satisfy the MIME type constraints (Only image/jpeg, image/png and SVG files are accepted)", - }, - }); + return res + .status(415) + .json( + createError( + "The uploaded image does not satisfy the MIME type constraints (Only image/jpeg, image/png and SVG files are accepted)" + ) + ); } const fileName = file.md5 + (fileIsSvg ? ".svg" : "." + fileType?.ext); if (fs.existsSync("media/" + fileName)) { - return res.status(409).json({ - type: "error", - payload: { - message: "The uploaded file already exists", - }, - _links: [ - { - rel: "self", - type: "GET", - href: "/api/media/" + fileName, - }, - ], - }); + return res.status(409).json(createError("The uploaded file already exists", {}, createMediaLinks(fileName))); } file.mv("media/" + fileName, console.error); @@ -98,12 +74,6 @@ export const uploadImage = async (req: Request, res: Response) => { payload: { message: "The file was uploaded and created on the server", }, - _links: [ - { - rel: "self", - type: "GET", - href: "/api/media/" + fileName, - }, - ], + _links: createMediaLinks(fileName), }); };