42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
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; |