Browse Source

#2225

update
tags/v1.22.9.2^2
chenyifan01 3 years ago
parent
commit
06161c0d17
15 changed files with 86 additions and 19 deletions
  1. +35
    -0
      models/limit_config.go
  2. +2
    -2
      models/reward_operate_record.go
  3. +2
    -0
      modules/auth/wechat/client.go
  4. +2
    -2
      modules/redis/redis_key/limit_redis_key.go
  5. +1
    -0
      routers/authentication/wechat.go
  6. +9
    -0
      routers/reward/point/limit.go
  7. +1
    -1
      routers/reward/point/point.go
  8. +1
    -0
      routers/routes/routes.go
  9. +1
    -2
      services/reward/admin_operate.go
  10. +20
    -1
      services/reward/limiter/config.go
  11. +1
    -1
      services/reward/limiter/limiter.go
  12. +4
    -3
      services/reward/operator.go
  13. +3
    -3
      services/reward/point/point_operate.go
  14. +3
    -3
      services/task/task.go
  15. +1
    -1
      services/task/task_config.go

+ 35
- 0
models/limit_config.go View File

@@ -59,27 +59,33 @@ type LimitConfig struct {
LimitType string `xorm:"NOT NULL"`
CreatorId int64 `xorm:"NOT NULL"`
CreatorName string
DeleterId int64
DeleterName string
CreatedUnix timeutil.TimeStamp `xorm:"created"`
DeletedAt timeutil.TimeStamp `xorm:"deleted"`
}

type LimitConfigVO struct {
ID int64
Tittle 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,
Tittle: l.Tittle,
RefreshRate: l.RefreshRate,
Scope: l.Scope,
LimitNum: l.LimitNum,
LimitCode: l.LimitCode,
LimitType: l.LimitType,
Creator: l.CreatorName,
CreatedUnix: l.CreatedUnix,
}
@@ -128,3 +134,32 @@ func AddLimitConfig(l *LimitConfig) error {
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
}

+ 2
- 2
models/reward_operate_record.go View File

@@ -109,7 +109,7 @@ const Semicolon = ";"
type RewardOperateOrderBy string

const (
RewardOrderByID RewardOperateOrderBy = "id"
RewardOrderByIDDesc RewardOperateOrderBy = "id desc"
)

type RewardOperateRecord struct {
@@ -253,7 +253,7 @@ func GetRewardRecordList(opts RewardRecordListOpts) ([]RewardOperateRecord, int6
}

if len(opts.OrderBy) == 0 {
opts.OrderBy = RewardOrderByID
opts.OrderBy = RewardOrderByIDDesc
}

r := make([]RewardOperateRecord, 0)


+ 2
- 0
modules/auth/wechat/client.go View File

@@ -66,6 +66,7 @@ func getWechatRestyClient() *resty.Client {
func callAccessToken() *AccessTokenResponse {
client := getWechatRestyClient()

log.Info("start to get wechat access token")
var result AccessTokenResponse
_, err := client.R().
SetQueryParam("grant_type", GRANT_TYPE).
@@ -77,6 +78,7 @@ func callAccessToken() *AccessTokenResponse {
log.Error("get wechat access token failed,e=%v", err)
return nil
}
log.Info("get wechat access token result=%v", result)
return &result
}



+ 2
- 2
modules/redis/redis_key/limit_redis_key.go View File

@@ -21,6 +21,6 @@ func LimitCount(userId int64, limitCode string, limitType string, scope string,

}

func LimitConfig(limitType models.LimitType) string {
return KeyJoin(LIMIT_REDIS_PREFIX, limitType.Name(), "config")
func LimitConfig(limitType string) string {
return KeyJoin(LIMIT_REDIS_PREFIX, limitType, "config")
}

+ 1
- 0
routers/authentication/wechat.go View File

@@ -29,6 +29,7 @@ func GetQRCode4Bind(ctx *context.Context) {

r, err := createQRCode4Bind(userId)
if err != nil {
log.Error("GetQRCode4Bind failed,error=%v", err)
ctx.JSON(200, map[string]interface{}{
"code": "9999",
"msg": "Get QR code failed",


+ 9
- 0
routers/reward/point/limit.go View File

@@ -25,3 +25,12 @@ func AddPointLimitConfig(ctx *context.Context, config models.LimitConfigVO) {
}
ctx.JSON(http.StatusOK, response.Success())
}
func DeletePointLimitConfig(ctx *context.Context) {
id := ctx.QueryInt64("id")
err := limiter.DeleteLimitConfig(id, ctx.User)
if err != nil {
ctx.JSON(http.StatusOK, response.ServerError(err.Error()))
return
}
ctx.JSON(http.StatusOK, response.Success())
}

+ 1
- 1
routers/reward/point/point.go View File

@@ -38,7 +38,7 @@ func GetPointRecordList(ctx *context.Context) {
var orderBy models.RewardOperateOrderBy
switch ctx.Query("sort") {
default:
orderBy = models.RewardOrderByID
orderBy = models.RewardOrderByIDDesc
}
t := models.GetRewardOperateTypeInstance(operateType)
if t == "" {


+ 1
- 0
routers/routes/routes.go View File

@@ -595,6 +595,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/reward/point", func() {
m.Get("/limiter/list", point.GetPointLimitConfigList)
m.Post("/limiter/add", bindIgnErr(models.LimitConfigVO{}), point.AddPointLimitConfig)
m.Post("/limiter/delete", point.DeletePointLimitConfig)
m.Post("/operate", binding.Bind(models.AdminRewardOperateReq{}), point.OperatePointAccountBalance)
})



+ 1
- 2
services/reward/admin_operate.go View File

@@ -4,7 +4,6 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/reward/limiter"
)

func AdminBalanceOperate(req models.AdminRewardOperateReq, doer *models.User) error {
@@ -37,7 +36,7 @@ func AdminBalanceOperate(req models.AdminRewardOperateReq, doer *models.User) er
RequestId: logId,
OperateType: req.OperateType,
Remark: req.Remark,
RejectPolicy: limiter.JustReject,
RejectPolicy: models.JustReject,
})

if err != nil {


+ 20
- 1
services/reward/limiter/config.go View File

@@ -18,6 +18,9 @@ func GetLimitConfigList(limitType models.LimitType) ([]*models.LimitConfigVO, er
}
return result, nil
}
func GetLimitConfigById(id int64) (*models.LimitConfig, error) {
return models.GetLimitConfigById(id)
}

func AddLimitConfig(config *models.LimitConfigVO, doer *models.User, limitType models.LimitType) error {
r := &models.LimitConfig{
@@ -36,6 +39,22 @@ func AddLimitConfig(config *models.LimitConfigVO, doer *models.User, limitType m
log.Error("add limit config error,config:%v err:%v", config, err)
return err
}
redis_client.Del(redis_key.LimitConfig(limitType))
redis_client.Del(redis_key.LimitConfig(limitType.Name()))
return nil
}

func DeleteLimitConfig(id int64, doer *models.User) error {
config, err := GetLimitConfigById(id)
if err != nil {
log.Error("GetLimitConfigById err,e=%v", err)
return err
}
err = models.DeleteLimitConfig(*config, doer.ID, doer.Name)

if err != nil {
log.Error("add limit config error,config:%v err:%v", config, err)
return err
}
redis_client.Del(redis_key.LimitConfig(config.LimitType))
return nil
}

+ 1
- 1
services/reward/limiter/limiter.go View File

@@ -219,7 +219,7 @@ func GetLimiters(limitCode string, limitType models.LimitType) ([]models.LimitCo
}

func GetLimitersByLimitType(limitType models.LimitType) ([]models.LimitConfig, error) {
redisKey := redis_key.LimitConfig(limitType)
redisKey := redis_key.LimitConfig(limitType.Name())
val, _ := redis_client.Get(redisKey)
if val != "" {
if val == redis_key.EMPTY_REDIS_VAL {


+ 4
- 3
services/reward/operator.go View File

@@ -16,7 +16,7 @@ var RewardOperatorMap = map[string]RewardOperator{
}

type RewardOperator interface {
IsLimited(ctx *models.RewardOperateContext) bool
IsLimited(ctx *models.RewardOperateContext) error
Operate(ctx *models.RewardOperateContext) error
}

@@ -62,8 +62,9 @@ func Operate(ctx *models.RewardOperateContext) error {

if ctx.OperateType == models.OperateTypeIncrease {
//is limited?
if isLimited := operator.IsLimited(ctx); isLimited {
return nil
if err := operator.IsLimited(ctx); err != nil {
log.Info("operator IsLimited, err=%v", err)
return err
}
}



+ 3
- 3
services/reward/point/point_operate.go View File

@@ -17,16 +17,16 @@ const LossMsg = "达到奖励上限,应得%d积分,实得%d积分"
type PointOperator struct {
}

func (operator *PointOperator) IsLimited(ctx *models.RewardOperateContext) bool {
func (operator *PointOperator) IsLimited(ctx *models.RewardOperateContext) error {
realAmount, err := limiter.CheckLimit(ctx.SourceType.Name(), models.LimitTypeRewardPoint, ctx.TargetUserId, ctx.Reward.Amount, ctx.RejectPolicy)
if err != nil {
return true
return err
}
if realAmount < ctx.Reward.Amount {
ctx.Remark = models.AppendRemark(ctx.Remark, fmt.Sprintf(LossMsg, ctx.Reward.Amount, realAmount))
ctx.Reward.Amount = realAmount
}
return false
return nil
}

func (operator *PointOperator) Operate(ctx *models.RewardOperateContext) error {


+ 3
- 3
services/task/task.go View File

@@ -49,7 +49,7 @@ func accomplish(action models.Action) error {
}

//is limited?
if isLimited(userId, config, limiter.JustReject) {
if isLimited(userId, config, models.JustReject) {
log.Info("task accomplish maximum times are reached,userId=%d taskType=%s", userId, taskType)
return nil
}
@@ -79,13 +79,13 @@ func accomplish(action models.Action) error {
TargetUserId: userId,
RequestId: logId,
OperateType: models.OperateTypeIncrease,
RejectPolicy: limiter.FillUp,
RejectPolicy: models.FillUp,
})

return nil
}

func isLimited(userId int64, config *models.TaskConfig, rejectPolicy limiter.LimiterRejectPolicy) bool {
func isLimited(userId int64, config *models.TaskConfig, rejectPolicy models.LimiterRejectPolicy) bool {
if _, err := limiter.CheckLimit(config.TaskCode, models.LimitTypeTask, userId, 1, rejectPolicy); err != nil {
return true
}


+ 1
- 1
services/task/task_config.go View File

@@ -95,7 +95,7 @@ func AddTaskConfig(config models.TaskConfigWithLimit, doer *models.User) error {
log.Error("add task config error,config:%v err:%v", config, err)
return err
}
redis_client.Del(redis_key.LimitConfig(models.LimitTypeTask))
redis_client.Del(redis_key.LimitConfig(models.LimitTypeTask.Name()))
redis_client.Del(redis_key.TaskConfigList())
return nil
}

Loading…
Cancel
Save