63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
"github.com/sjzar/chatlog/internal/errors"
|
|
"github.com/sjzar/chatlog/internal/model"
|
|
)
|
|
|
|
// SearchMessages 执行全文检索,并在返回前补充联系人/群聊信息。
|
|
func (r *Repository) SearchMessages(ctx context.Context, req *model.SearchRequest) (*model.SearchResponse, error) {
|
|
if req == nil {
|
|
return nil, errors.InvalidArg("request")
|
|
}
|
|
|
|
nReq := req.Clone()
|
|
if nReq == nil {
|
|
nReq = &model.SearchRequest{}
|
|
}
|
|
|
|
// 兼容现有的联系人/群聊别名:在进入数据源前将 talker/sender 解析成真实 userName
|
|
normalizedTalker, normalizedSender := r.parseTalkerAndSender(ctx, nReq.Talker, nReq.Sender)
|
|
nReq.Talker = normalizedTalker
|
|
nReq.Sender = normalizedSender
|
|
|
|
if nReq.Limit <= 0 {
|
|
nReq.Limit = 20
|
|
}
|
|
if nReq.Limit > 200 {
|
|
nReq.Limit = 200
|
|
}
|
|
if nReq.Offset < 0 {
|
|
nReq.Offset = 0
|
|
}
|
|
|
|
resp, err := r.searchMessagesWithIndex(ctx, nReq)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if resp == nil {
|
|
resp = &model.SearchResponse{Hits: []*model.SearchHit{}, Limit: nReq.Limit, Offset: nReq.Offset}
|
|
}
|
|
|
|
// Enrich message metadata(头像、群昵称、显示名等)
|
|
messages := make([]*model.Message, 0, len(resp.Hits))
|
|
for _, hit := range resp.Hits {
|
|
if hit == nil || hit.Message == nil {
|
|
continue
|
|
}
|
|
messages = append(messages, hit.Message)
|
|
}
|
|
|
|
if len(messages) > 0 {
|
|
if err := r.EnrichMessages(ctx, messages); err != nil {
|
|
log.Debug().Msgf("EnrichMessages in search failed: %v", err)
|
|
}
|
|
}
|
|
|
|
return resp, nil
|
|
}
|