feat: filter receive messages by conversation and query
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user