You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

task_config.go 6.4 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package task
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/modules/redis/redis_client"
  6. "code.gitea.io/gitea/modules/redis/redis_key"
  7. "code.gitea.io/gitea/modules/redis/redis_lock"
  8. "code.gitea.io/gitea/services/reward/limiter"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "time"
  13. )
  14. //GetTaskConfig get task config from redis cache first
  15. // if not exist in redis, find in db and refresh the redis key
  16. func GetTaskConfig(taskType string) (*models.TaskConfig, error) {
  17. list, err := GetTaskConfigList()
  18. if err != nil {
  19. log.Error(" GetTaskConfigList error. %v", err)
  20. return nil, err
  21. }
  22. for _, v := range list {
  23. if v.TaskCode == taskType {
  24. return v, nil
  25. }
  26. }
  27. return nil, nil
  28. }
  29. func GetTaskConfigList() ([]*models.TaskConfig, error) {
  30. redisKey := redis_key.TaskConfigList()
  31. configStr, _ := redis_client.Get(redisKey)
  32. if configStr != "" {
  33. if configStr == redis_key.EMPTY_REDIS_VAL {
  34. return nil, nil
  35. }
  36. config := make([]*models.TaskConfig, 0)
  37. json.Unmarshal([]byte(configStr), &config)
  38. return config, nil
  39. }
  40. config, err := models.GetTaskConfigList()
  41. if err != nil {
  42. log.Error(" GetTaskConfigList from model error. %v", err)
  43. if models.IsErrRecordNotExist(err) {
  44. redis_client.Setex(redisKey, redis_key.EMPTY_REDIS_VAL, 5*time.Second)
  45. return nil, nil
  46. }
  47. return nil, err
  48. }
  49. jsonStr, _ := json.Marshal(config)
  50. redis_client.Setex(redisKey, string(jsonStr), 30*24*time.Hour)
  51. return config, nil
  52. }
  53. func GetTaskConfigPageWithDeleted(opt models.GetTaskConfigOpts) ([]*models.TaskAndLimiterConfig, int64, error) {
  54. config, count, err := models.GetTaskConfigPageWithDeleted(opt)
  55. if err != nil {
  56. log.Error(" GetTaskConfigPageWithDeleted from model error. %v", err)
  57. if models.IsErrRecordNotExist(err) {
  58. return nil, 0, nil
  59. }
  60. return nil, 0, err
  61. }
  62. return config, count, nil
  63. }
  64. func GetTaskConfigWithLimitList(opt models.GetTaskConfigOpts) (*models.TaskConfigWithLimitResponse, error) {
  65. list, n, err := GetTaskConfigPageWithDeleted(opt)
  66. if err != nil {
  67. return nil, err
  68. }
  69. if len(list) == 0 {
  70. return nil, nil
  71. }
  72. r := make([]*models.TaskConfigWithSingleLimit, 0)
  73. for i := 0; i < len(list); i++ {
  74. li := list[i]
  75. t := &models.TaskConfigWithSingleLimit{
  76. ID: li.TaskConfig.ID,
  77. TaskCode: li.TaskConfig.TaskCode,
  78. AwardType: li.TaskConfig.AwardType,
  79. AwardAmount: li.TaskConfig.AwardAmount,
  80. Creator: li.TaskConfig.CreatorName,
  81. CreatedUnix: li.TaskConfig.CreatedUnix,
  82. IsDeleted: li.TaskConfig.DeletedAt > 0,
  83. DeleteAt: li.TaskConfig.DeletedAt,
  84. LimitNum: li.LimitConfig.LimitNum,
  85. RefreshRate: li.LimitConfig.RefreshRate,
  86. }
  87. r = append(r, t)
  88. }
  89. return &models.TaskConfigWithLimitResponse{
  90. Records: r,
  91. Page: opt.Page,
  92. PageSize: opt.PageSize,
  93. Total: n,
  94. }, nil
  95. }
  96. func AddTaskConfig(config models.TaskConfigWithLimit, doer *models.User) error {
  97. if config.TaskCode == "" || config.AwardType == "" {
  98. log.Error(" EditTaskConfig param error")
  99. return errors.New("param error")
  100. }
  101. var lock = redis_lock.NewDistributeLock(redis_key.TaskConfigOperateLock(config.TaskCode, config.AwardType))
  102. isOk, _ := lock.LockWithWait(3*time.Second, 3*time.Second)
  103. if !isOk {
  104. return errors.New("Get lock failed")
  105. }
  106. defer lock.UnLock()
  107. t, err := models.GetTaskConfigByTaskCode(config.TaskCode)
  108. if err != nil && !models.IsErrRecordNotExist(err) {
  109. return err
  110. }
  111. if t != nil {
  112. return errors.New("task config is exist")
  113. }
  114. for i, l := range config.Limiters {
  115. if l.Scope == "" {
  116. config.Limiters[i].Scope = models.LimitScopeSingleUser.Name()
  117. }
  118. }
  119. err = models.NewTaskConfig(config, doer)
  120. if err != nil {
  121. log.Error("add task config error,config:%v err:%v", config, err)
  122. return err
  123. }
  124. redis_client.Del(redis_key.LimitConfig(models.LimitTypeTask.Name()))
  125. redis_client.Del(redis_key.TaskConfigList())
  126. return nil
  127. }
  128. func EditTaskConfig(config models.TaskConfigWithLimit, doer *models.User) error {
  129. if config.TaskCode == "" || config.AwardType == "" || config.ID <= 0 {
  130. log.Error(" EditTaskConfig param error")
  131. return errors.New("param error")
  132. }
  133. var lock = redis_lock.NewDistributeLock(redis_key.TaskConfigOperateLock(config.TaskCode, config.AwardType))
  134. isOk, _ := lock.LockWithWait(3*time.Second, 3*time.Second)
  135. if !isOk {
  136. return errors.New("Get lock failed")
  137. }
  138. defer lock.UnLock()
  139. t, err := models.GetTaskConfigByID(config.ID)
  140. if err != nil {
  141. return err
  142. }
  143. if t == nil {
  144. return errors.New("task config is not exist")
  145. }
  146. for i, l := range config.Limiters {
  147. if l.Scope == "" {
  148. config.Limiters[i].Scope = models.LimitScopeSingleUser.Name()
  149. }
  150. }
  151. err = models.EditTaskConfig(config, doer)
  152. if err != nil {
  153. log.Error("add task config error,config:%v err:%v", config, err)
  154. return err
  155. }
  156. redis_client.Del(redis_key.LimitConfig(models.LimitTypeTask.Name()))
  157. redis_client.Del(redis_key.TaskConfigList())
  158. return nil
  159. }
  160. func DelTaskConfig(id int64, doer *models.User) error {
  161. if id == 0 {
  162. log.Error(" EditTaskConfig param error")
  163. return errors.New("param error")
  164. }
  165. err := models.DelTaskConfig(id, doer)
  166. if err != nil {
  167. log.Error("del task config error,err:%v", err)
  168. return err
  169. }
  170. redis_client.Del(redis_key.LimitConfig(models.LimitTypeTask.Name()))
  171. redis_client.Del(redis_key.TaskConfigList())
  172. return nil
  173. }
  174. func GetPointRule() (*models.PointRule, error) {
  175. r, err := limiter.GetSingleDailyPointLimitConfig()
  176. if err != nil {
  177. return nil, err
  178. }
  179. limiters, err := limiter.GetLimitersByLimitType(models.LimitTypeTask)
  180. if err != nil {
  181. return nil, err
  182. }
  183. limiterMap := make(map[string]*models.LimitConfig, 0)
  184. for i := 0; i < len(limiters); i++ {
  185. limiterMap[limiters[i].LimitCode] = &limiters[i]
  186. }
  187. taskConfigs, err := GetTaskConfigList()
  188. if err != nil {
  189. return nil, err
  190. }
  191. taskRules := make([]models.TaskRule, len(taskConfigs))
  192. for i, taskConfig := range taskConfigs {
  193. rule := models.TaskRule{
  194. TaskCode: taskConfig.TaskCode,
  195. AwardType: taskConfig.AwardType,
  196. AwardAmount: taskConfig.AwardAmount,
  197. }
  198. limiter := limiterMap[fmt.Sprint(taskConfig.TaskCode)]
  199. if limiter != nil {
  200. rule.RefreshRate = limiter.RefreshRate
  201. rule.LimitNum = limiter.LimitNum
  202. }
  203. taskRules[i] = rule
  204. }
  205. pointRule := &models.PointRule{
  206. TaskRules: taskRules,
  207. }
  208. if r != nil {
  209. pointRule.UserDailyLimit = r.LimitNum
  210. }
  211. return pointRule, nil
  212. }