feat: filter receive messages by conversation and query

This commit is contained in:
zhaoyilun
2026-07-10 01:22:17 +08:00
parent bbffa2189d
commit e7324d8aa6
9 changed files with 181 additions and 21 deletions

View File

@@ -23,7 +23,9 @@ type Message struct {
}
type ReceiveMessagesQuery struct {
Limit int
ConversationID string
Query string
Limit int
}
type ReceiveMessagesResult struct {
@@ -41,9 +43,6 @@ func (s EncryptedPacketLogSource) ReceiveMessages(ctx context.Context, query Rec
}
messages := make([]Message, 0, limit)
for index, line := range s.Lines {
if len(messages) == limit {
break
}
select {
case <-ctx.Done():
return ReceiveMessagesResult{}, ctx.Err()
@@ -57,11 +56,43 @@ func (s EncryptedPacketLogSource) ReceiveMessages(ctx context.Context, query Rec
if err != nil {
return ReceiveMessagesResult{}, fmt.Errorf("parse packet log line %d: %w", index, err)
}
messages = append(messages, normalizePacketMessage(parsed))
message := normalizePacketMessage(parsed)
if !receiveMessageMatchesQuery(message, query) {
continue
}
messages = append(messages, message)
if len(messages) == limit {
break
}
}
return ReceiveMessagesResult{Messages: messages}, nil
}
func receiveMessageMatchesQuery(message Message, query ReceiveMessagesQuery) bool {
if strings.TrimSpace(query.ConversationID) != "" && message.ConversationID != strings.TrimSpace(query.ConversationID) {
return false
}
keyword := strings.ToLower(strings.TrimSpace(query.Query))
if keyword == "" {
return true
}
values := []string{
message.ID,
message.ConversationID,
message.SenderID,
message.ReceiverID,
message.Text,
message.Subject,
message.ReceiptID,
}
for _, value := range values {
if strings.Contains(strings.ToLower(value), keyword) {
return true
}
}
return false
}
func normalizePacketMessage(msg packetlog.Message) Message {
sender := bareJID(msg.From)
receiver := bareJID(msg.To)