mirror of
https://github.com/detleph/server.git
synced 2026-09-04 08:36:06 +02:00
Extract shared error code
+ Create new functions for generating errors
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user