diff --git a/api/routes/media.ts b/api/routes/media.ts new file mode 100644 index 0000000..92175de --- /dev/null +++ b/api/routes/media.ts @@ -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; \ No newline at end of file