Created the POST /media/upload route to upload media

This commit is contained in:
Mathias Wagner 2022-09-09 15:43:40 +02:00
parent 3a38ad2d36
commit 4d084c3e23
Signed by: Mathias
GPG Key ID: B8DC354B0A1F5B44

42
api/routes/media.ts Normal file
View File

@ -0,0 +1,42 @@
import Router, {NextFunction, Response} from 'express';
import {AuthenticatedRequest, hasRank} from "../middlewares/authenticate";
import {Rank} from "../../models/User";
import Multer from "multer";
import path from "path";
import {bucket} from "../../controller/bucket";
import {createMedia} from "../../controller/media";
const app = Router();
const multer = Multer({
storage: Multer.memoryStorage(),
limits: {fileSize: 100 * 1024 * 1024},
});
const fileSizeErrorHandler = (err: Error, req: AuthenticatedRequest, res: Response, next: NextFunction) => {
if (err) return res.status(413).json({message: "The provided file is too big"});
next();
}
app.post("/upload", hasRank(Rank.TEAM_MEMBER), multer.any(), fileSizeErrorHandler, async (req: AuthenticatedRequest, res: Response) => {
if (!req.files) return res.status(400).json({message: "No file uploaded"});
const files = req.files as Express.Multer.File[]
const media = await createMedia(req.user.clientId, files[0].originalname, path.extname(files[0].originalname).substring(1));
const blobStream = bucket.file(media.assetId).createWriteStream();
blobStream.on('error', async () => {
await media.delete();
res.status(500).json({message: "An internal error occurred"});
});
blobStream.on('finish', () => res.json({
message: "Successfully uploaded the provided asset",
assetId: media.assetId
}));
blobStream.end(files[0].buffer);
});
module.exports = app;