@@ -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}) | |||
} |