package models import ( "code.gitea.io/gitea/modules/timeutil" ) const ( PeriodNotCycle = "NOT_CYCLE" PeriodDaily = "DAILY" ) //PointTaskConfig Only add and delete are allowed, edit is not allowed //so if you want to edit config for some task code,please delete first and add new one type TaskConfig struct { ID int64 `xorm:"pk autoincr"` TaskCode string `xorm:"NOT NULL"` Tittle string AwardType string `xorm:"NOT NULL"` AwardAmount int64 `xorm:"NOT NULL"` CreatorId int64 `xorm:"NOT NULL"` CreatorName string CreatedUnix timeutil.TimeStamp `xorm:"created"` DeletedAt timeutil.TimeStamp `xorm:"deleted"` DeleterId int64 DeleterName string } type TaskConfigWithLimit struct { ID int64 TaskCode string Tittle string AwardType string AwardAmount int64 Creator string IsDeleted bool CreatedUnix timeutil.TimeStamp DeleteAt timeutil.TimeStamp Limiters []*LimitConfigVO } type TaskConfigWithLimitResponse struct { Records []*TaskConfigWithSingleLimit Total int64 PageSize int Page int } type TaskConfigWithSingleLimit struct { ID int64 TaskCode string AwardType string AwardAmount int64 Creator string IsDeleted bool CreatedUnix timeutil.TimeStamp DeleteAt timeutil.TimeStamp RefreshRate string LimitNum int64 } type TaskAndLimiterConfig struct { TaskConfig TaskConfig `xorm:"extends"` LimitConfig LimitConfig `xorm:"extends"` } func (TaskAndLimiterConfig) TableName() string { return "task_config" } type BatchLimitConfigVO struct { ConfigList []TaskConfigWithLimit } func getTaskConfig(t *TaskConfig) (*TaskConfig, error) { has, err := x.Get(t) if err != nil { return nil, err } else if !has { return nil, ErrRecordNotExist{} } return t, nil } func GetTaskConfigByTaskCode(taskCode string) (*TaskConfig, error) { t := &TaskConfig{ TaskCode: taskCode, } return getTaskConfig(t) } func GetTaskConfigByID(id int64) (*TaskConfig, error) { t := &TaskConfig{ ID: id, } return getTaskConfig(t) } func GetTaskConfigList() ([]*TaskConfig, error) { r := make([]*TaskConfig, 0) err := x.Find(&r) if err != nil { return nil, err } if len(r) == 0 { return nil, ErrRecordNotExist{} } return r, nil } func GetTaskConfigPageWithDeleted(opt ListOptions) ([]*TaskAndLimiterConfig, int64, error) { if opt.Page <= 0 { opt.Page = 1 } n, err := x.Unscoped().Count(&TaskConfig{}) if err != nil { return nil, 0, err } r := make([]*TaskAndLimiterConfig, 0) err = x.Join("LEFT", "limit_config", "task_config.id = limit_config.related_id").Unscoped().Limit(opt.PageSize, (opt.Page-1)*opt.PageSize).OrderBy("task_config.deleted_at desc,task_config.id desc").Find(&r) if len(r) == 0 { return nil, 0, ErrRecordNotExist{} } return r, n, nil } func EditTaskConfig(config TaskConfigWithLimit, doer *User) error { sess := x.NewSession() defer sess.Close() //delete old task config p := &TaskConfig{ ID: config.ID, } _, err := sess.Delete(p) if err != nil { sess.Rollback() return err } //update deleter p.DeleterId = doer.ID p.DeleterName = doer.Name sess.Where("id = ?", config.ID).Unscoped().Update(p) //add new config t := &TaskConfig{ TaskCode: config.TaskCode, Tittle: config.Tittle, AwardType: config.AwardType, AwardAmount: config.AwardAmount, CreatorId: doer.ID, CreatorName: doer.Name, } _, err = sess.InsertOne(t) if err != nil { sess.Rollback() return err } //delete old limiter config lp := &LimitConfig{ RelatedId: config.ID, } _, err = sess.Delete(lp) if err != nil { sess.Rollback() return err } lp.DeleterName = doer.Name lp.DeleterId = doer.ID //update deleter sess.Where("related_id = ?", config.ID).Unscoped().Update(lp) //add new limiter config if config.Limiters != nil && len(config.Limiters) > 0 { for _, v := range config.Limiters { //add new config l := &LimitConfig{ Tittle: v.Tittle, RefreshRate: v.RefreshRate, Scope: v.Scope, LimitNum: v.LimitNum, LimitCode: config.TaskCode, LimitType: LimitTypeTask.Name(), CreatorId: doer.ID, CreatorName: doer.Name, RelatedId: t.ID, } _, err = sess.Insert(l) if err != nil { sess.Rollback() return err } } } sess.Commit() return nil } func NewTaskConfig(config TaskConfigWithLimit, doer *User) error { sess := x.NewSession() defer sess.Close() //add new config t := &TaskConfig{ TaskCode: config.TaskCode, Tittle: config.Tittle, AwardType: config.AwardType, AwardAmount: config.AwardAmount, CreatorId: doer.ID, CreatorName: doer.Name, } _, err := sess.InsertOne(t) if err != nil { sess.Rollback() return err } //add new limiter config if config.Limiters != nil && len(config.Limiters) > 0 { for _, v := range config.Limiters { //add new config l := &LimitConfig{ RelatedId: t.ID, Tittle: v.Tittle, RefreshRate: v.RefreshRate, Scope: v.Scope, LimitNum: v.LimitNum, LimitCode: config.TaskCode, LimitType: LimitTypeTask.Name(), CreatorId: doer.ID, CreatorName: doer.Name, } _, err = sess.Insert(l) if err != nil { sess.Rollback() return err } } } sess.Commit() return nil } func DelTaskConfig(id int64, doer *User) error { sess := x.NewSession() defer sess.Close() //delete old task config p := &TaskConfig{ ID: id, } _, err := sess.Delete(p) if err != nil { sess.Rollback() return err } //update deleter p.DeleterId = doer.ID p.DeleterName = doer.Name sess.Where("id = ?", id).Unscoped().Update(p) //delete old limiter config lp := &LimitConfig{ RelatedId: id, } _, err = sess.Delete(lp) if err != nil { sess.Rollback() return err } lp.DeleterName = doer.Name lp.DeleterId = doer.ID //update deleter sess.Where("related_id = ?", id).Unscoped().Update(lp) sess.Commit() return nil }