feat(search): align conversation search order
This commit is contained in:
@@ -199,9 +199,9 @@ func (r *SearchRepo) searchConversationsInternal(ctx context.Context, accountID
|
||||
|
||||
// Apply sort + pagination
|
||||
orderClause := filter.OrderClause()
|
||||
// Conversations default to last_activity_at DESC NULLS LAST
|
||||
// Chatwoot SearchService#filter_conversations orders by created_at DESC.
|
||||
if filter.SortBy == "created_at" || filter.SortBy == "" {
|
||||
orderClause = "conversations.last_activity_at DESC NULLS LAST, conversations.id DESC"
|
||||
orderClause = "conversations.created_at DESC, conversations.id DESC"
|
||||
}
|
||||
|
||||
err := q.Offset(filter.Offset()).Limit(filter.PerPage).
|
||||
|
||||
@@ -362,6 +362,29 @@ func TestSearchRepo_SearchConversations_DoesNotMatchLabelsOrMessages(t *testing.
|
||||
assert.Empty(t, results)
|
||||
}
|
||||
|
||||
func TestSearchRepo_SearchConversations_DefaultOrderUsesCreatedAt(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
repo := NewSearchRepo(db)
|
||||
|
||||
account := createTestAccountForSearch(t, db)
|
||||
older := createTestConversationForSearch(t, db, account.ID, "open", "")
|
||||
newer := createTestConversationForSearch(t, db, account.ID, "open", "")
|
||||
base := time.Date(2026, 6, 7, 12, 0, 0, 0, time.UTC)
|
||||
olderActivity := base.Add(time.Hour).Unix()
|
||||
newerActivity := base.Add(-time.Hour).Unix()
|
||||
require.NoError(t, db.Model(older).Updates(map[string]any{"created_at": base.Add(-time.Hour), "last_activity_at": olderActivity}).Error)
|
||||
require.NoError(t, db.Model(newer).Updates(map[string]any{"created_at": base.Add(time.Hour), "last_activity_at": newerActivity}).Error)
|
||||
|
||||
filter := &search.SearchFilter{Page: 1, PerPage: 25}
|
||||
results, total, err := repo.SearchConversations(context.Background(), account.ID, "", filter)
|
||||
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, int64(2), total)
|
||||
require.Len(t, results, 2)
|
||||
assert.Equal(t, newer.ID, results[0].ID)
|
||||
assert.Equal(t, older.ID, results[1].ID)
|
||||
}
|
||||
|
||||
func TestSearchRepo_SearchConversations_WithStatusFilter(t *testing.T) {
|
||||
skipIfSQLite(t)
|
||||
db := setupTestDB(t)
|
||||
|
||||
Reference in New Issue
Block a user