Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions manage/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -1677,3 +1677,59 @@ func (m *Manager) PublicUserInfoByUserId(userId string) (*modelexts.User, *perro

return userExt, nil
}

func (m *Manager) PublicUserInfoByUserIdOrName(userIdOrName string) (*modelexts.User, *perror.PlutoError) {
users, err := models.Users(qm.Where("user_id = ? OR name = ?", userIdOrName, userIdOrName)).All(m.db)
if err != nil {
return nil, perror.ServerError.Wrapper(err)
}

// 优先精确匹配 user_id
var user *models.User
for _, u := range users {
if u.UserID == userIdOrName {
user = u
break
}
}
if user == nil {
// name 不保证唯一,仅当昵称唯一匹配时才按昵称查找,避免定位到错误用户
for _, u := range users {
if u.Name != userIdOrName {
continue
}
if user != nil {
return nil, perror.UserNotExist
}
user = u
}
}
if user == nil {
return nil, perror.UserNotExist
}

bindings, err := models.Bindings(qm.Where("user_id = ?", user.ID)).All(m.db)

if err != nil {
return nil, perror.ServerError.Wrapper(err)
}

userExt := &modelexts.User{
User: user,
Bindings: bindings,
}

return userExt, nil
}

func (m *Manager) SearchUsersByName(name string) ([]*models.User, *perror.PlutoError) {
users, err := models.Users(
qm.Where("name LIKE ?", "%"+name+"%"),
qm.Limit(20),
).All(m.db)
if err != nil {
return nil, perror.ServerError.Wrapper(err)
}

return users, nil
}
6 changes: 6 additions & 0 deletions modelexts/exts.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ func (u User) PublicInfo() map[string]interface{} {
return res
}

func (u User) SearchInfo() map[string]interface{} {
res := u.PublicInfo()
res["user_id"] = u.User.UserID
return res
}

type Scopes struct {
Application *models.Application `json:"application"`
Scopes []*models.RbacScope `json:"scopes"`
Expand Down
14 changes: 14 additions & 0 deletions route/v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,20 @@ func (r *Router) registerUserV1Routes(prefix string) {
middle: middleware.NoAuthMiddleware,
handler: r.v1.PublicUserInfoByUserId,
},
{
path: "/info/identity/{userIdOrName}/public",
description: "Get user public info like avatar, name by userId or unique name",
method: "GET",
middle: middleware.NoAuthMiddleware,
handler: r.v1.PublicUserInfoByUserIdOrName,
},
{
path: "/search",
description: "Search users by name",
method: "GET",
middle: middleware.AccessTokenAuthMiddleware,
handler: r.v1.SearchUsers,
},
{
path: "/delete",
description: "Delete user",
Expand Down
37 changes: 37 additions & 0 deletions route/v1/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
perror "github.com/MuShare/pluto/datatype/pluto_error"
"github.com/MuShare/pluto/datatype/request"
"github.com/MuShare/pluto/manage"
"github.com/MuShare/pluto/modelexts"
"github.com/MuShare/pluto/utils/general"
"github.com/MuShare/pluto/utils/mail"
routeUtils "github.com/MuShare/pluto/utils/route"
Expand Down Expand Up @@ -405,6 +406,42 @@ func (router *Router) PublicUserInfoByUserId(w http.ResponseWriter, r *http.Requ
return nil
}

func (router *Router) PublicUserInfoByUserIdOrName(w http.ResponseWriter, r *http.Request) *perror.PlutoError {
vars := mux.Vars(r)
userIdOrName := vars["userIdOrName"]
res, perr := router.manager.PublicUserInfoByUserIdOrName(userIdOrName)

if perr != nil {
return perr
}

routeUtils.ResponseOK(res.PublicInfo(), w)

return nil
}

func (router *Router) SearchUsers(w http.ResponseWriter, r *http.Request) *perror.PlutoError {
name := r.URL.Query().Get("name")
if name == "" {
return perror.BadRequest
}

users, perr := router.manager.SearchUsersByName(name)

if perr != nil {
return perr
}

res := make([]map[string]interface{}, 0)
for _, u := range users {
res = append(res, (&modelexts.User{User: u}).SearchInfo())
}

routeUtils.ResponseOK(res, w)

return nil
}

func (router *Router) DeleteUser(w http.ResponseWriter, r *http.Request) *perror.PlutoError {
payload, perr := routeUtils.GetAccessPayload(r)
if perr != nil {
Expand Down
Loading