Extract shared error code

+ Create new functions for generating errors
This commit is contained in:
Stephan
2022-05-18 08:27:11 +02:00
committed by La_Felx
parent bb4f4babce
commit 13d6f881ea
2 changed files with 32 additions and 47 deletions
+15
View File
@@ -3,6 +3,21 @@ import { PrismaClientKnownRequestError, PrismaClientUnknownRequestError } from "
import { Request, Response } from "express"; import { Request, Response } from "express";
import prisma from "../lib/prisma"; 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 { export enum DataType {
STRING = "string", STRING = "string",
NUMBER = "number", NUMBER = "number",
+17 -47
View File
@@ -2,25 +2,19 @@ import { Request, Response } from "express";
import fs from "fs"; import fs from "fs";
import isSvg from "is-svg"; import isSvg from "is-svg";
import { fromBuffer as fileTypeFromBuffer } from "file-type"; 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) => { export const uploadImage = async (req: Request, res: Response) => {
if (!req.auth?.isAuthenticated) { if (!req.auth?.isAuthenticated) {
return res.status(500).json({ return res.status(500).json(AUTH_ERROR);
type: "failure",
payload: {
message: "The server was not able to validate your credentials; Please try again later",
},
});
} }
if (!(req.auth.permission_level === "ELEVATED")) { if (!(req.auth.permission_level === "ELEVATED")) {
return res.status(403).json({ return res.status(403).json(createInsufficientPermissionsError());
type: "error",
payload: {
message: "You do not have sufficient permissions to use this feature",
required_level: "ELEVATED",
},
});
} }
if (!req.files || !("file" in req.files)) { if (!req.files || !("file" in req.files)) {
@@ -50,13 +44,7 @@ export const uploadImage = async (req: Request, res: Response) => {
if (file.size > 1024 * 1024) { if (file.size > 1024 * 1024) {
// Maybe resize (express-fileupload seems to support this) // Maybe resize (express-fileupload seems to support this)
return res.status(413).json({ return res.status(413).json(createError("The uploaded image is too large", { max_size: "1 MB" }));
type: "error",
payload: {
message: "The uploaded image is too large",
max_size: "1 MB",
},
});
} }
const fileIsSvg = isSvg(file.data); 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 (!(fileType && ["image/jpeg", "image/png"].includes(fileType.mime))) {
if (!fileIsSvg) if (!fileIsSvg)
return res.status(415).json({ return res
type: "error", .status(415)
payload: { .json(
message: createError(
"The uploaded image does not satisfy the MIME type constraints (Only image/jpeg, image/png and SVG files are accepted)", "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); const fileName = file.md5 + (fileIsSvg ? ".svg" : "." + fileType?.ext);
if (fs.existsSync("media/" + fileName)) { if (fs.existsSync("media/" + fileName)) {
return res.status(409).json({ return res.status(409).json(createError("The uploaded file already exists", {}, createMediaLinks(fileName)));
type: "error",
payload: {
message: "The uploaded file already exists",
},
_links: [
{
rel: "self",
type: "GET",
href: "/api/media/" + fileName,
},
],
});
} }
file.mv("media/" + fileName, console.error); file.mv("media/" + fileName, console.error);
@@ -98,12 +74,6 @@ export const uploadImage = async (req: Request, res: Response) => {
payload: { payload: {
message: "The file was uploaded and created on the server", message: "The file was uploaded and created on the server",
}, },
_links: [ _links: createMediaLinks(fileName),
{
rel: "self",
type: "GET",
href: "/api/media/" + fileName,
},
],
}); });
}; };