| @@ -1,6 +1,7 @@ | |||
| package models | |||
| import ( | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| ) | |||
| @@ -97,3 +98,45 @@ func GetAccountByUserId(userId int64) (*PointAccount, error) { | |||
| func InsertAccount(tl *PointAccount) (int64, error) { | |||
| return x.Insert(tl) | |||
| } | |||
| type SearchPointAccountOpts struct { | |||
| ListOptions | |||
| Keyword string | |||
| } | |||
| type SearchPointAccountResponse struct { | |||
| Records []*UserPointAccount | |||
| PageSize int | |||
| Page int | |||
| Total int64 | |||
| } | |||
| type UserPointAccount struct { | |||
| UserId int64 | |||
| UserName string | |||
| Email string | |||
| Balance int64 | |||
| TotalEarned int64 | |||
| TotalConsumed int64 | |||
| } | |||
| func (UserPointAccount) TableName() string { | |||
| return "user" | |||
| } | |||
| func GetPointAccountMapByUserIds(userIds []int64) (map[int64]*PointAccount, error) { | |||
| if len(userIds) == 0 { | |||
| return make(map[int64]*PointAccount, 0), nil | |||
| } | |||
| accounts := make([]*PointAccount, 0) | |||
| err := x.In("user_id", userIds).Find(&accounts) | |||
| if err != nil { | |||
| log.Error("GetPointAccountMapByUserIds error.%v", err) | |||
| return nil, err | |||
| } | |||
| accountMap := make(map[int64]*PointAccount, 0) | |||
| for _, v := range accounts { | |||
| accountMap[v.UserId] = v | |||
| } | |||
| return accountMap, nil | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| package point | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/routers/response" | |||
| "code.gitea.io/gitea/services/reward/point/account" | |||
| "net/http" | |||
| ) | |||
| func SearchPointAccount(ctx *context.Context) { | |||
| q := ctx.Query("q") | |||
| page := ctx.QueryInt("page") | |||
| resopnse, err := account.SearchPointAccount(models.SearchPointAccountOpts{ListOptions: models.ListOptions{Page: page, PageSize: 20}, Keyword: q}) | |||
| if err != nil { | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| return | |||
| } | |||
| ctx.JSON(http.StatusOK, response.SuccessWithData(resopnse)) | |||
| return | |||
| } | |||
| @@ -608,7 +608,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| 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) | |||
| m.Get("/account/search", point.SearchPointAccount) | |||
| m.Post("/account/operate", binding.Bind(models.AdminRewardOperateReq{}), point.OperatePointAccountBalance) | |||
| }) | |||
| m.Group("/task/config", func() { | |||
| @@ -1,6 +1,7 @@ | |||
| package account | |||
| import ( | |||
| "bytes" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/redis/redis_client" | |||
| @@ -9,6 +10,7 @@ import ( | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/util" | |||
| "encoding/json" | |||
| "strings" | |||
| "time" | |||
| ) | |||
| @@ -89,3 +91,68 @@ func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, r | |||
| return a.Balance >= uniPrice | |||
| } | |||
| func SearchPointAccount(opt models.SearchPointAccountOpts) (*models.SearchPointAccountResponse, error) { | |||
| var result = &models.SearchPointAccountResponse{ | |||
| Records: make([]*models.UserPointAccount, 0), | |||
| PageSize: opt.PageSize, | |||
| Page: opt.Page, | |||
| Total: 0, | |||
| } | |||
| userSearch := &models.SearchUserOptions{ | |||
| Type: models.UserTypeIndividual, | |||
| ListOptions: models.ListOptions{ | |||
| PageSize: 20, | |||
| }, | |||
| SearchByEmail: true, | |||
| OrderBy: models.SearchOrderByAlphabetically, | |||
| } | |||
| userSearch.Page = opt.Page | |||
| if userSearch.Page <= 0 { | |||
| userSearch.Page = 1 | |||
| } | |||
| userSearch.Keyword = strings.Trim(opt.Keyword, " ") | |||
| if len(userSearch.Keyword) == 0 || isKeywordValid(userSearch.Keyword) { | |||
| users, count, err := models.SearchUsers(userSearch) | |||
| if err != nil { | |||
| log.Error("SearchPointAccount SearchUsers error.%v", err) | |||
| return nil, err | |||
| } | |||
| userIds := make([]int64, 0) | |||
| for _, v := range users { | |||
| userIds = append(userIds, v.ID) | |||
| } | |||
| accountMap, err := models.GetPointAccountMapByUserIds(userIds) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| records := make([]*models.UserPointAccount, 0) | |||
| for _, v := range users { | |||
| upa := &models.UserPointAccount{ | |||
| UserId: v.ID, | |||
| UserName: v.Name, | |||
| Email: v.Email, | |||
| Balance: 0, | |||
| TotalEarned: 0, | |||
| TotalConsumed: 0, | |||
| } | |||
| a := accountMap[v.ID] | |||
| if a != nil { | |||
| upa.Balance = a.Balance | |||
| upa.TotalConsumed = a.TotalConsumed | |||
| upa.TotalEarned = a.TotalEarned | |||
| } | |||
| records = append(records, upa) | |||
| } | |||
| result.Records = records | |||
| result.Total = count | |||
| } | |||
| return result, nil | |||
| } | |||
| func isKeywordValid(keyword string) bool { | |||
| return !bytes.Contains([]byte(keyword), []byte{0x00}) | |||
| } | |||