fix version 1
This commit is contained in:
@@ -53,6 +53,12 @@ func CopyFile(ctx context.Context, in *pb.CopyFileRequest) (reply *pb.StatusRepl
|
||||
return nil, errcode.ErrAlreadyExists
|
||||
}
|
||||
|
||||
// 校验容量配额,复制会新增一份文件占用
|
||||
if err := checkQuota(auth.ID, file.Size); err != nil {
|
||||
printer.Error("Check quota error: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 创建文件副本
|
||||
newFile := models.CloudDiskFile{
|
||||
Std_IICUDS: types.Std_IICUDS{
|
||||
|
||||
@@ -85,10 +85,16 @@ func GetDir(ctx context.Context, in *pb.IdentRequest) (reply *pb.CloudDiskDirIte
|
||||
}
|
||||
}
|
||||
|
||||
// 根目录的 ParentID 为空,需先判空再解引用
|
||||
parentID := uint64(0)
|
||||
if dir.ParentID != nil {
|
||||
parentID = uint64(*dir.ParentID)
|
||||
}
|
||||
|
||||
reply = &pb.CloudDiskDirItem{
|
||||
Id: uint64(dir.ID),
|
||||
Identity: dir.Identity,
|
||||
ParentId: uint64(*dir.ParentID),
|
||||
ParentId: parentID,
|
||||
Name: dir.Name,
|
||||
Path: dir.Path,
|
||||
CreatedAt: dir.CreatedAt.Format(time.RFC3339),
|
||||
|
||||
@@ -91,10 +91,16 @@ func GetDirTree(ctx context.Context, in *pb.IdentRequest) (reply *pb.CloudDiskDi
|
||||
}
|
||||
}
|
||||
|
||||
// 根目录的 ParentID 为空,需先判空再解引用
|
||||
parentID := uint64(0)
|
||||
if dir.ParentID != nil {
|
||||
parentID = uint64(*dir.ParentID)
|
||||
}
|
||||
|
||||
reply = &pb.CloudDiskDirItem{
|
||||
Id: uint64(dir.ID),
|
||||
Identity: dir.Identity,
|
||||
ParentId: uint64(*dir.ParentID),
|
||||
ParentId: parentID,
|
||||
Name: dir.Name,
|
||||
Path: dir.Path,
|
||||
CreatedAt: dir.CreatedAt.Format(time.RFC3339),
|
||||
|
||||
43
module/base/cloud/internal/logic/disk/quota.go
Normal file
43
module/base/cloud/internal/logic/disk/quota.go
Normal file
@@ -0,0 +1,43 @@
|
||||
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
|
||||
}
|
||||
@@ -52,6 +52,12 @@ func UploadFile(ctx context.Context, in *pb.CloudDiskFileRequest) (reply *pb.Sta
|
||||
return nil, errcode.ErrAlreadyExists
|
||||
}
|
||||
|
||||
// 校验容量配额,「已用 + 本次」不得超过上限
|
||||
if err := checkQuota(auth.ID, in.Size); err != nil {
|
||||
printer.Error("Check quota error: %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 生成文件哈希(如果未提供)
|
||||
fileHash := in.Hash
|
||||
if fileHash == "" {
|
||||
|
||||
Reference in New Issue
Block a user