Files

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
}