Cài đặt quota cho các thành viên
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
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 };
|
||||
Reference in New Issue
Block a user