@@ -0,0 +1,26 @@
|
||||
package usersearcher
|
||||
|
||||
import "91porn-server/app/service/searcher"
|
||||
|
||||
type UserRes = searcher.UserRes
|
||||
|
||||
type Result struct {
|
||||
dat []searcher.UserRes
|
||||
hasNext bool
|
||||
}
|
||||
|
||||
func (*Result) Types() searcher.ResultTypes {
|
||||
return searcher.UserSearchResult
|
||||
}
|
||||
|
||||
func (r *Result) Data() interface{} {
|
||||
return r.dat
|
||||
}
|
||||
|
||||
func (r *Result) Count() int64 {
|
||||
return int64(len(r.dat))
|
||||
}
|
||||
|
||||
func (r *Result) HasNext() bool {
|
||||
return r.hasNext
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user