Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

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
}