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;