feat(conversations): finish message mutation parity

This commit is contained in:
2026-06-05 02:10:42 +08:00
parent 5c44ca0c50
commit a465bbe09d
10 changed files with 420 additions and 42 deletions
+44 -1
View File
@@ -51,6 +51,49 @@ func (r *MessageRepo) FindByConversation(ctx context.Context, conversationID uin
return messages, total, err
}
// FindByConversationFinder mirrors Chatwoot's MessageFinder before/after windows.
func (r *MessageRepo) FindByConversationFinder(ctx context.Context, conversationID uint, after, before uint, filterInternal bool) ([]model.Message, int64, error) {
query := r.db.WithContext(ctx).Model(&model.Message{}).Where("conversation_id = ?", conversationID)
if filterInternal {
query = query.Where("NOT (private = ? OR message_type = ?)", true, model.MessageTypeActivity)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
var messages []model.Message
switch {
case after != 0 && before != 0:
err := query.Where("id >= ? AND id < ?", after, before).Order("created_at ASC, id ASC").Limit(1000).Find(&messages).Error
return messages, total, err
case before != 0:
err := query.Where("id < ?", before).Order("created_at DESC, id DESC").Limit(20).Find(&messages).Error
if err != nil {
return nil, 0, err
}
reverseMessages(messages)
return messages, total, nil
case after != 0:
err := query.Where("id > ?", after).Order("created_at ASC, id ASC").Limit(100).Find(&messages).Error
return messages, total, err
default:
err := query.Order("created_at DESC, id DESC").Limit(20).Find(&messages).Error
if err != nil {
return nil, 0, err
}
reverseMessages(messages)
return messages, total, nil
}
}
func reverseMessages(messages []model.Message) {
for i, j := 0, len(messages)-1; i < j; i, j = i+1, j-1 {
messages[i], messages[j] = messages[j], messages[i]
}
}
// FindByAccountAndID retrieves a message scoped to an account.
func (r *MessageRepo) FindByAccountAndID(ctx context.Context, accountID, id uint) (*model.Message, error) {
var message model.Message
@@ -201,4 +244,4 @@ func (r *MessageRepo) FindLastIncomingByConversation(ctx context.Context, conver
return nil, err
}
return &message, nil
}
}