44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
package disk
|
||
|
||
import (
|
||
"bsm/full/module/base/cloud/internal/impl"
|
||
"bsm/full/module/base/cloud/internal/models"
|
||
"git.apinb.com/bsm-sdk/core/errcode"
|
||
"git.apinb.com/bsm-sdk/core/printer"
|
||
)
|
||
|
||
// defaultMaxStorage 默认容量配额100GB,与 Space.Get 创建默认空间时的取值保持一致
|
||
const defaultMaxStorage int64 = 100 * 1024 * 1024 * 1024
|
||
|
||
// checkQuota 校验「已用空间 + 本次新增」是否超出配额,超出返回明确错误
|
||
func checkQuota(passportID uint, addSize int64) error {
|
||
if addSize <= 0 {
|
||
return nil
|
||
}
|
||
|
||
// 配额取用户空间记录的 max_storage,无空间记录时使用默认配额
|
||
maxStorage := defaultMaxStorage
|
||
var space models.CloudSpace
|
||
if err := impl.DBService.Where("passport_id = ?", passportID).First(&space).Error; err == nil && space.MaxStorage > 0 {
|
||
maxStorage = space.MaxStorage
|
||
}
|
||
|
||
// 已用空间按云盘文件实际占用统计
|
||
var usedStorage int64
|
||
row := impl.DBService.Model(&models.CloudDiskFile{}).
|
||
Joins("JOIN cloud_disk_dirs ON cloud_disk_files.directory_id = cloud_disk_dirs.id").
|
||
Where("cloud_disk_dirs.passport_id = ?", passportID).
|
||
Select("COALESCE(SUM(cloud_disk_files.size), 0)").
|
||
Row()
|
||
if err := row.Scan(&usedStorage); err != nil {
|
||
printer.Error("Query used storage error: %v", err)
|
||
return errcode.ErrDB
|
||
}
|
||
|
||
if usedStorage+addSize > maxStorage {
|
||
return errcode.ErrResourceExhausted
|
||
}
|
||
|
||
return nil
|
||
}
|