82 lines
2.8 KiB
Go
82 lines
2.8 KiB
Go
package db
|
|
|
|
import (
|
|
jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
type PackageAccessStatDB struct {
|
|
*DB
|
|
}
|
|
|
|
func (db *DB) PackageAccessStat() *PackageAccessStatDB {
|
|
return &PackageAccessStatDB{db}
|
|
}
|
|
|
|
func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID jcstypes.PackageID, spaceID jcstypes.UserSpaceID) (jcstypes.PackageAccessStat, error) {
|
|
var ret jcstypes.PackageAccessStat
|
|
err := ctx.Table("PackageAccessStat").Where("PackageID = ? AND UserSpaceID = ?", pkgID, spaceID).First(&ret).Error
|
|
return ret, err
|
|
}
|
|
|
|
func (*PackageAccessStatDB) GetByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) {
|
|
var ret []jcstypes.PackageAccessStat
|
|
err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error
|
|
return ret, err
|
|
}
|
|
|
|
func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) {
|
|
if len(pkgIDs) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
var ret []jcstypes.PackageAccessStat
|
|
err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error
|
|
return ret, err
|
|
}
|
|
|
|
func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error {
|
|
if len(entries) == 0 {
|
|
return nil
|
|
}
|
|
|
|
accs := make([]jcstypes.PackageAccessStat, len(entries))
|
|
for i, e := range entries {
|
|
accs[i] = jcstypes.PackageAccessStat{
|
|
PackageID: e.PackageID,
|
|
UserSpaceID: e.UserSpaceID,
|
|
Counter: e.Counter,
|
|
}
|
|
}
|
|
|
|
return ctx.Clauses(clause.OnConflict{
|
|
Columns: []clause.Column{{Name: "PackageID"}, {Name: "UserSpaceID"}},
|
|
DoUpdates: clause.Assignments(map[string]any{
|
|
"Counter": gorm.Expr("Counter + values(Counter)"),
|
|
}),
|
|
}).Table("PackageAccessStat").Create(&accs).Error
|
|
}
|
|
|
|
func (*PackageAccessStatDB) BatchUpdateAmount(ctx SQLContext, pkgIDs []jcstypes.PackageID, historyWeight float64) error {
|
|
if len(pkgIDs) == 0 {
|
|
return nil
|
|
}
|
|
|
|
sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0 WHERE PackageID IN (?)"
|
|
return ctx.Exec(sql, historyWeight, historyWeight, pkgIDs).Error
|
|
}
|
|
|
|
func (*PackageAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64) error {
|
|
sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0"
|
|
return ctx.Exec(sql, historyWeight, historyWeight).Error
|
|
}
|
|
|
|
func (*PackageAccessStatDB) DeleteByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) error {
|
|
return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&jcstypes.PackageAccessStat{}).Error
|
|
}
|
|
|
|
func (*PackageAccessStatDB) DeleteByUserSpaceID(ctx SQLContext, spaceID jcstypes.UserSpaceID) error {
|
|
return ctx.Table("PackageAccessStat").Where("UserSpaceID = ?", spaceID).Delete(&jcstypes.PackageAccessStat{}).Error
|
|
}
|