const Asset = require('../models/Asset'); const fs = require('fs'); const path = require('path'); // Cấu hình Quota cho từng nhóm người dùng (đơn vị: Bytes) const ROLE_QUOTAS = { 'Thành viên': 2 * 1024 * 1024 * 1024, // 2GB 'editor': 10 * 1024 * 1024 * 1024, // 10GB 'admin': 100 * 1024 * 1024 * 1024, // 100GB (hoặc Infinity) 'Chủ sở hữu': Infinity // Không giới hạn }; /** * Middleware kiểm tra giới hạn lưu trữ của người dùng */ const checkQuota = async (req, res, next) => { if (!req.user) return res.status(401).json({ message: 'Unauthorized' }); const userRole = req.user.role || 'Thành viên'; const quota = ROLE_QUOTAS[userRole] || ROLE_QUOTAS['Thành viên']; // Nếu không giới hạn thì đi tiếp if (quota === Infinity) return next(); try { // Sử dụng MongoDB Aggregation để tính tổng dung lượng ngay trên database const usageResult = await Asset.aggregate([ { $match: { uploadedBy: req.user._id } }, { $group: { _id: null, totalUsage: { $sum: { $ifNull: ["$fileSize", 0] } } } } ]); const currentUsage = usageResult.length > 0 ? usageResult[0].totalUsage : 0; const newFileSize = req.file ? req.file.size : 0; if (currentUsage + newFileSize > quota) { // Xóa file tạm vừa upload lên nếu vượt định mức if (req.file && fs.existsSync(req.file.path)) fs.unlinkSync(req.file.path); return res.status(403).json({ message: `Vượt quá giới hạn lưu trữ. Định mức của bạn là ${(quota / (1024**3)).toFixed(1)}GB. Bạn đã sử dụng ${(currentUsage / (1024**3)).toFixed(2)}GB.` }); } next(); } catch (error) { console.error('[Quota Check Error]:', error); next(); // Cho phép đi tiếp nếu lỗi logic kiểm tra để tránh chặn người dùng oan } }; module.exports = { checkQuota, ROLE_QUOTAS };