package model import ( "github.com/HFO4/cloudreve/pkg/cache" "github.com/HFO4/cloudreve/pkg/util" "github.com/jinzhu/gorm" "strconv" "time" ) // StoragePack 容量包模型 type StoragePack struct { // 表字段 gorm.Model Name string UserID uint ActiveTime *time.Time ExpiredTime *time.Time `gorm:"index:expired"` Size uint64 } // Create 创建容量包 func (pack *StoragePack) Create() (uint, error) { if err := DB.Create(pack).Error; err != nil { util.Log().Warning("无法插入离线下载记录, %s", err) return 0, err } return pack.ID, nil } // GetAvailablePackSize 返回给定用户当前可用的容量包总容量 func (user *User) GetAvailablePackSize() uint64 { var ( total uint64 firstExpire *time.Time timeNow = time.Now() ttl int64 ) // 尝试从缓存中读取 cacheKey := "pack_size_" + strconv.FormatUint(uint64(user.ID), 10) if total, ok := cache.Get(cacheKey); ok { return total.(uint64) } // 查找所有有效容量包 packs := user.GetAvailableStoragePacks() // 计算总容量, 并找到其中最早的过期时间 for _, v := range packs { total += v.Size if firstExpire == nil { firstExpire = v.ExpiredTime continue } if v.ExpiredTime != nil && firstExpire.After(*v.ExpiredTime) { firstExpire = v.ExpiredTime } } // 用最早的过期时间计算缓存TTL,并写入缓存 if firstExpire != nil { ttl = firstExpire.Unix() - timeNow.Unix() if ttl > 0 { _ = cache.Set(cacheKey, total, int(ttl)) } } return total } // GetAvailableStoragePacks 返回用户可用的容量包 func (user *User) GetAvailableStoragePacks() []StoragePack { var packs []StoragePack timeNow := time.Now() // 查找所有有效容量包 DB.Where("expired_time > ? AND user_id = ?", timeNow, user.ID).Find(&packs) return packs } // GetExpiredStoragePack 获取已过期的容量包 func GetExpiredStoragePack() []StoragePack { var packs []StoragePack DB.Where("expired_time < ?", time.Now()).Find(&packs) return packs } // Delete 删除容量包 func (pack *StoragePack) Delete() error { return DB.Delete(&pack).Error }