package models import ( "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) type LimitType string const ( LimitTypeTask LimitType = "TASK" LimitTypeRewardPoint LimitType = "REWARD_POINT" ) func (l LimitType) Name() string { switch l { case LimitTypeTask: return "TASK" case LimitTypeRewardPoint: return "REWARD_POINT" default: return "" } } type LimitScope string const ( LimitScopeAllUsers LimitScope = "ALL_USERS" LimitScopeSingleUser LimitScope = "SINGLE_USER" ) func (l LimitScope) Name() string { switch l { case LimitScopeAllUsers: return "ALL_USERS" case LimitScopeSingleUser: return "SINGLE_USER" default: return "" } } type LimiterRejectPolicy string const ( JustReject LimiterRejectPolicy = "JUST_REJECT" PermittedOnce LimiterRejectPolicy = "PERMITTED_ONCE" FillUp LimiterRejectPolicy = "FillUp" ) type LimitConfig struct { ID int64 `xorm:"pk autoincr"` Title string RefreshRate string `xorm:"NOT NULL"` Scope string `xorm:"NOT NULL"` LimitNum int64 `xorm:"NOT NULL"` LimitCode string LimitType string `xorm:"NOT NULL"` RelatedId int64 `xorm:"INDEX"` CreatorId int64 `xorm:"NOT NULL"` CreatorName string DeleterId int64 DeleterName string CreatedUnix timeutil.TimeStamp `xorm:"created"` DeletedAt timeutil.TimeStamp `xorm:"deleted"` } type LimitConfigQueryOpts struct { RefreshRate string Scope LimitScope LimitCode string LimitType LimitType } type LimitConfigVO struct { ID int64 Title string RefreshRate string Scope string LimitNum int64 LimitCode string LimitType string Creator string CreatedUnix timeutil.TimeStamp } func (l *LimitConfig) ToLimitConfigVO() *LimitConfigVO { return &LimitConfigVO{ ID: l.ID, Title: l.Title, RefreshRate: l.RefreshRate, Scope: l.Scope, LimitNum: l.LimitNum, LimitCode: l.LimitCode, LimitType: l.LimitType, Creator: l.CreatorName, CreatedUnix: l.CreatedUnix, } } func GetLimitConfigByLimitType(limitType LimitType) ([]LimitConfig, error) { r := make([]LimitConfig, 0) err := x.Where(" limit_type = ?", limitType.Name()).Find(&r) if err != nil { return nil, err } else if len(r) == 0 { return nil, ErrRecordNotExist{} } return r, nil } func GetLimitersByRelatedIdWithDeleted(limitType LimitType) ([]LimitConfig, error) { r := make([]LimitConfig, 0) err := x.Unscoped().Where(" = ?", limitType.Name()).Find(&r) if err != nil { return nil, err } else if len(r) == 0 { return nil, ErrRecordNotExist{} } return r, nil } func AddLimitConfig(l *LimitConfig) error { sess := x.NewSession() defer sess.Close() //delete old limit config cond := builder.NewCond() cond = cond.And(builder.Eq{"limit_type": l.LimitType}) cond = cond.And(builder.Eq{"scope": l.Scope}) if l.LimitCode == "" { subCond := builder.NewCond() subCond = subCond.Or(builder.IsNull{"limit_code"}) subCond = subCond.Or(builder.Eq{"limit_code": ""}) cond = cond.And(subCond) } else { cond = cond.And(builder.Eq{"limit_code": l.LimitCode}) } _, err := sess.Where(cond).Delete(&LimitConfig{}) if err != nil { sess.Rollback() return err } //add new config _, err = sess.Insert(l) if err != nil { sess.Rollback() return err } sess.Commit() return nil } func DeleteLimitConfig(config LimitConfig, deleterId int64, deleterName string) error { sess := x.NewSession() defer sess.Close() _, err := x.ID(config.ID).Update(&LimitConfig{DeleterName: deleterName, DeleterId: deleterId}) if err != nil { sess.Rollback() return err } _, err = x.ID(config.ID).Delete(&LimitConfig{}) if err != nil { sess.Rollback() return err } sess.Commit() return nil } func GetLimitConfigById(id int64) (*LimitConfig, error) { r := &LimitConfig{} isOk, err := x.ID(id).Get(r) if err != nil { return nil, err } else if !isOk { return nil, nil } return r, nil }