feat(conversations): finish message mutation parity
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user