This is an automated email from the ASF dual-hosted git repository.

linkinstar pushed a commit to branch feat/1.3.1/staff
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git

commit 8b694e32c43ba2e7b06584c095e9bbbae4be8a5b
Author: LinkinStars <[email protected]>
AuthorDate: Fri Apr 26 10:25:59 2024 +0800

    feat(user): add the API for get staff
---
 internal/controller/user_controller.go   | 20 ++++++++++++++++++++
 internal/repo/user/user_repo.go          |  8 ++++++--
 internal/router/answer_api_router.go     |  1 +
 internal/schema/user_schema.go           | 16 ++++++++++++++++
 internal/service/content/user_service.go | 20 +++++++++++++++++++-
 internal/service/user_common/user.go     |  5 +++--
 6 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/internal/controller/user_controller.go 
b/internal/controller/user_controller.go
index f0e70cfe..f6e14323 100644
--- a/internal/controller/user_controller.go
+++ b/internal/controller/user_controller.go
@@ -657,6 +657,26 @@ func (uc *UserController) UserRanking(ctx *gin.Context) {
        handler.HandleResponse(ctx, err, resp)
 }
 
+// UserStaff get user staff
+// @Summary get user staff
+// @Description get user staff
+// @Tags User
+// @Accept json
+// @Produce json
+// @Security ApiKeyAuth
+// @Param data body schema.GetUserStaffReq true "GetUserStaffReq"
+// @Success 200 {object} handler.RespBody{data=schema.GetUserStaffResp}
+// @Router /answer/api/v1/user/staff [get]
+func (uc *UserController) UserStaff(ctx *gin.Context) {
+       req := &schema.GetUserStaffReq{}
+       if handler.BindAndCheck(ctx, req) {
+               return
+       }
+
+       resp, err := uc.userService.GetUserStaff(ctx, req)
+       handler.HandleResponse(ctx, err, resp)
+}
+
 // UserUnsubscribeNotification unsubscribe notification
 // @Summary unsubscribe notification
 // @Description unsubscribe notification
diff --git a/internal/repo/user/user_repo.go b/internal/repo/user/user_repo.go
index 628394cf..568ebf90 100644
--- a/internal/repo/user/user_repo.go
+++ b/internal/repo/user/user_repo.go
@@ -246,12 +246,16 @@ func (ur *userRepo) GetUserCount(ctx context.Context) 
(count int64, err error) {
        return count, nil
 }
 
-func (ur *userRepo) SearchUserListByName(ctx context.Context, name string, 
limit int) (userList []*entity.User, err error) {
+func (ur *userRepo) SearchUserListByName(ctx context.Context, name string, 
limit int,
+       onlyStaff bool) (userList []*entity.User, err error) {
        userList = make([]*entity.User, 0)
        session := ur.data.DB.Context(ctx)
+       if onlyStaff {
+               session.Join("INNER", "user_role_rel", "`user`.id = 
`user_role_rel`.user_id AND `user_role_rel`.role_id > 1")
+       }
        session.Where("status = ?", entity.UserStatusAvailable)
        session.Where("username LIKE ? OR display_name LIKE ?", 
strings.ToLower(name)+"%", name+"%")
-       session.OrderBy("username ASC, id DESC")
+       session.OrderBy("username ASC, `user`.id DESC")
        session.Limit(limit)
        err = session.Find(&userList)
        if err != nil {
diff --git a/internal/router/answer_api_router.go 
b/internal/router/answer_api_router.go
index 1ea2be89..6d50086b 100644
--- a/internal/router/answer_api_router.go
+++ b/internal/router/answer_api_router.go
@@ -146,6 +146,7 @@ func (a *AnswerAPIRouter) RegisterUnAuthAnswerAPIRouter(r 
*gin.RouterGroup) {
        // user
        r.GET("/personal/user/info", 
a.userController.GetOtherUserInfoByUsername)
        r.GET("/user/ranking", a.userController.UserRanking)
+       r.GET("/user/staff", a.userController.UserStaff)
 
        // answer
        r.GET("/answer/info", a.answerController.Get)
diff --git a/internal/schema/user_schema.go b/internal/schema/user_schema.go
index a95acfc7..8079b904 100644
--- a/internal/schema/user_schema.go
+++ b/internal/schema/user_schema.go
@@ -412,3 +412,19 @@ type UserUnsubscribeNotificationReq struct {
        Code    string `validate:"required,gt=0,lte=500" json:"code"`
        Content string `json:"-"`
 }
+
+// GetUserStaffReq get user staff request
+type GetUserStaffReq struct {
+       Username string `validate:"omitempty,gt=0,lte=500" form:"username"`
+       PageSize int    `validate:"omitempty,min=1" form:"page_size"`
+}
+
+// GetUserStaffResp get user staff response
+type GetUserStaffResp struct {
+       // username
+       Username string `json:"username"`
+       // display name
+       DisplayName string `json:"display_name"`
+       // avatar
+       Avatar string `json:"avatar"`
+}
diff --git a/internal/service/content/user_service.go 
b/internal/service/content/user_service.go
index 4c9843a3..a2b33005 100644
--- a/internal/service/content/user_service.go
+++ b/internal/service/content/user_service.go
@@ -741,6 +741,24 @@ func (us *UserService) UserRanking(ctx context.Context) 
(resp *schema.UserRankin
        return us.warpStatRankingResp(userInfoMapping, rankStat, voteStat, 
userRoleRels), nil
 }
 
+// GetUserStaff get user staff
+func (us *UserService) GetUserStaff(ctx context.Context, req 
*schema.GetUserStaffReq) (
+       resp []*schema.GetUserStaffResp, err error) {
+       userList, err := us.userRepo.SearchUserListByName(ctx, req.Username, 
req.PageSize, true)
+       if err != nil {
+               return nil, err
+       }
+       avatarMapping := us.siteInfoService.FormatListAvatar(ctx, userList)
+       for _, u := range userList {
+               resp = append(resp, &schema.GetUserStaffResp{
+                       Username:    u.Username,
+                       DisplayName: u.DisplayName,
+                       Avatar:      avatarMapping[u.ID].GetURL(),
+               })
+       }
+       return resp, nil
+}
+
 // UserUnsubscribeNotification user unsubscribe email notification
 func (us *UserService) UserUnsubscribeNotification(
        ctx context.Context, req *schema.UserUnsubscribeNotificationReq) (err 
error) {
@@ -858,7 +876,7 @@ func (us *UserService) SearchUserListByName(ctx 
context.Context, req *schema.Get
        if len(req.Username) == 0 {
                return resp, nil
        }
-       userList, err := us.userRepo.SearchUserListByName(ctx, req.Username, 5)
+       userList, err := us.userRepo.SearchUserListByName(ctx, req.Username, 5, 
false)
        if err != nil {
                return resp, err
        }
diff --git a/internal/service/user_common/user.go 
b/internal/service/user_common/user.go
index 334bcc4e..5e1a4830 100644
--- a/internal/service/user_common/user.go
+++ b/internal/service/user_common/user.go
@@ -21,9 +21,10 @@ package usercommon
 
 import (
        "context"
+       "strings"
+
        "github.com/apache/incubator-answer/internal/base/constant"
        "github.com/apache/incubator-answer/pkg/converter"
-       "strings"
 
        "github.com/Chain-Zhang/pinyin"
        "github.com/apache/incubator-answer/internal/base/reason"
@@ -57,7 +58,7 @@ type UserRepo interface {
        GetByUsernames(ctx context.Context, usernames []string) 
([]*entity.User, error)
        GetByEmail(ctx context.Context, email string) (userInfo *entity.User, 
exist bool, err error)
        GetUserCount(ctx context.Context) (count int64, err error)
-       SearchUserListByName(ctx context.Context, name string, limit int) 
(userList []*entity.User, err error)
+       SearchUserListByName(ctx context.Context, name string, limit int, 
onlyStaff bool) (userList []*entity.User, err error)
 }
 
 // UserCommon user service

Reply via email to