diff --git a/routes/video.js b/routes/video.js index 1012ca7..b822c85 100644 --- a/routes/video.js +++ b/routes/video.js @@ -10,20 +10,27 @@ const router = express.Router(); const UPLOADS_DIR = path.join(__dirname, '..', 'uploads'); const DOWNLOADS_DIR = path.join(__dirname, '..', 'downloads'); -const MAX_FILE_SIZE = 200 * 1024 * 1024; // 200MB +const MAX_FILE_SIZE = 200 * 1024 * 1024; // 200MB for users +const MAX_FILE_SIZE_ADMIN = 1024 * 1024 * 1024; // 1GB for admin -const upload = multer({ - dest: UPLOADS_DIR, - limits: { fileSize: MAX_FILE_SIZE }, - fileFilter: (req, file, cb) => { - const valid = ['video/mp4', 'video/webm', 'video/quicktime', 'video/x-msvideo', 'video/x-matroska', 'video/mpeg', 'video/3gpp', 'video/ogg']; - if (valid.includes(file.mimetype) || file.originalname.match(/\.(mp4|webm|mov|avi|mkv|mpeg|mpg|3gp|ogg|flv|wmv)$/i)) { - cb(null, true); - } else { - cb(new Error('Неподдерживаемый формат видео')); - } - }, -}); +function videoFileFilter(req, file, cb) { + const valid = ['video/mp4', 'video/webm', 'video/quicktime', 'video/x-msvideo', 'video/x-matroska', 'video/mpeg', 'video/3gpp', 'video/ogg']; + if (valid.includes(file.mimetype) || file.originalname.match(/\.(mp4|webm|mov|avi|mkv|mpeg|mpg|3gp|ogg|flv|wmv)$/i)) { + cb(null, true); + } else { + cb(new Error('Неподдерживаемый формат видео')); + } +} + +const uploadUser = multer({ dest: UPLOADS_DIR, limits: { fileSize: MAX_FILE_SIZE }, fileFilter: videoFileFilter }); +const uploadAdmin = multer({ dest: UPLOADS_DIR, limits: { fileSize: MAX_FILE_SIZE_ADMIN }, fileFilter: videoFileFilter }); + +// Pick multer based on user role +function uploadMiddleware(req, res, next) { + const isAdmin = req.session && req.session.user && req.session.user.role === 'admin'; + const handler = isAdmin ? uploadAdmin.single('video') : uploadUser.single('video'); + handler(req, res, next); +} const limiter = rateLimit({ windowMs: 60000, max: 10, message: { error: 'Слишком много запросов' } }); @@ -93,7 +100,7 @@ router.get('/', (req, res) => { }); // Upload and get info -router.post('/upload', limiter, upload.single('video'), async (req, res) => { +router.post('/upload', limiter, uploadMiddleware, async (req, res) => { if (!req.file) return res.status(400).json({ error: 'Файл не загружен' }); try { @@ -236,7 +243,11 @@ router.get('/download/:filename', (req, res) => { // Multer error handler router.use((err, req, res, next) => { if (err instanceof multer.MulterError) { - if (err.code === 'LIMIT_FILE_SIZE') return res.status(413).json({ error: 'Файл слишком большой. Максимум 200MB.' }); + if (err.code === 'LIMIT_FILE_SIZE') { + const isAdmin = req.session && req.session.user && req.session.user.role === 'admin'; + const limit = isAdmin ? '1 GB' : '200 MB'; + return res.status(413).json({ error: 'Файл слишком большой. Максимум ' + limit + '.' }); + } return res.status(400).json({ error: err.message }); } if (err) return res.status(400).json({ error: err.message });