106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package usersearcher
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
|
|
"91porn-server/app/appg"
|
|
"91porn-server/app/service/searcher"
|
|
"91porn-server/models/v/usermod"
|
|
)
|
|
|
|
// UserSearcher UserSearcher
|
|
type UserSearcher struct {
|
|
uid uint64
|
|
}
|
|
|
|
// NewUserSearcher NewUserSearcher
|
|
func NewUserSearcher(uid uint64) searcher.Searcher {
|
|
return &UserSearcher{
|
|
uid: uid,
|
|
}
|
|
}
|
|
|
|
// Search Search
|
|
func (u *UserSearcher) Search(keyword searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
|
|
kw, ok := keyword.Get().(string)
|
|
if !ok {
|
|
return nil, errors.New("keyword type error")
|
|
}
|
|
limitEx1 := opt.Limit() + 1
|
|
hasNext := false
|
|
if kw == "" { //关键字为空 返回最新用户
|
|
uList, err := usermod.NewUserList(opt.Skip(), limitEx1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(uList) > int(opt.Limit()) {
|
|
hasNext = true
|
|
uList = uList[:opt.Limit()]
|
|
}
|
|
userResList := searcher.MapToUserResList(uList, u.uid)
|
|
return &Result{userResList, hasNext}, nil
|
|
}
|
|
userList := make([]*usermod.User, 0, limitEx1)
|
|
uid, err := strconv.ParseUint(kw, 10, 64)
|
|
var esHasNext bool
|
|
if err == nil { //能解析成Int 通过uid搜索
|
|
user, err := usermod.FindUserByUID(uid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if user != nil {
|
|
userList = append(userList, user)
|
|
}
|
|
} else { //通过用户名搜索
|
|
var uList []*usermod.User
|
|
if appg.Conf.Elastic.IsActive {
|
|
uList, esHasNext, err = esSearch(kw, opt)
|
|
} else {
|
|
uList, err = usermod.FindUsersByKeyword(kw, opt.Skip(), limitEx1)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
userList = append(userList, uList...)
|
|
}
|
|
if len(userList) == 0 {
|
|
return &Result{[]UserRes{}, false}, nil
|
|
}
|
|
if len(userList) > int(opt.Limit()) {
|
|
hasNext = true
|
|
userList = userList[:opt.Limit()]
|
|
}
|
|
if appg.Conf.Elastic.IsActive {
|
|
hasNext = esHasNext
|
|
}
|
|
userResList := searcher.MapToUserResList(userList, u.uid)
|
|
return &Result{userResList, hasNext}, nil
|
|
}
|
|
|
|
func esSearch(keyword string, opt searcher.Opter) (users []*usermod.User, hasNext bool, err error) {
|
|
esUsers, err := usermod.Search(keyword, opt.Skip(), opt.Limit()+1)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if len(esUsers) == 0 {
|
|
return
|
|
}
|
|
uidList := make([]uint64, len(esUsers))
|
|
for i, v := range esUsers {
|
|
uidList[i] = v.Source.UID
|
|
}
|
|
hasNext = len(esUsers) > int(opt.Limit())
|
|
uMap, err := usermod.FindUsersMapByUID(uidList)
|
|
if err != nil || uMap == nil {
|
|
return
|
|
}
|
|
users = make([]*usermod.User, 0, len(esUsers))
|
|
for _, v := range esUsers {
|
|
if u, ok := uMap[v.Source.UID]; ok {
|
|
users = append(users, u)
|
|
}
|
|
}
|
|
return
|
|
}
|