Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,17 @@ func (c *Client) QueryUsers(ctx context.Context, q *QueryUsersOptions, sorters .
return &resp, err
}

// ParsedPredefinedFilterResponse contains the interpolated filter and sort from a predefined filter.
// This is returned in the QueryChannels response when using a predefined filter.
type ParsedPredefinedFilterResponse struct {
Name string `json:"name"`
Filter map[string]interface{} `json:"filter"`
Sort []*SortOption `json:"sort,omitempty"`
}

type queryChannelResponse struct {
Channels []queryChannelResponseData `json:"channels"`
Channels []queryChannelResponseData `json:"channels"`
PredefinedFilter *ParsedPredefinedFilterResponse `json:"predefined_filter,omitempty"`
Response
}

Expand All @@ -113,7 +122,8 @@ type queryChannelResponseData struct {
}

type QueryChannelsResponse struct {
Channels []*Channel
Channels []*Channel
PredefinedFilter *ParsedPredefinedFilterResponse
Response
}

Expand Down Expand Up @@ -157,7 +167,11 @@ func (c *Client) QueryChannels(ctx context.Context, q *QueryOption, sort ...*Sor
result[i].client = c
}

return &QueryChannelsResponse{Channels: result, Response: resp.Response}, nil
return &QueryChannelsResponse{
Channels: result,
PredefinedFilter: resp.PredefinedFilter,
Response: resp.Response,
}, nil
}

type SearchRequest struct {
Expand Down
40 changes: 40 additions & 0 deletions query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package stream_chat

import (
"context"
"encoding/json"
"fmt"
"testing"
"time"
Expand Down Expand Up @@ -320,6 +321,45 @@ func TestClient_QueryMessageFlags(t *testing.T) {
assert.Len(t, got.Flags, 1)
}

func TestQueryChannelsResponse_ParsedPredefinedFilter(t *testing.T) {
// Test that ParsedPredefinedFilterResponse is correctly unmarshaled from JSON
jsonData := `{
"channels": [],
"predefined_filter": {
"name": "user_messaging",
"filter": {"type": "messaging", "members": {"$in": ["user123"]}},
"sort": [{"field": "last_message_at", "direction": -1}]
},
"duration": "0.01s"
}`

var resp queryChannelResponse
err := json.Unmarshal([]byte(jsonData), &resp)
require.NoError(t, err)

require.NotNil(t, resp.PredefinedFilter)
require.Equal(t, "user_messaging", resp.PredefinedFilter.Name)
require.NotNil(t, resp.PredefinedFilter.Filter)
require.Equal(t, "messaging", resp.PredefinedFilter.Filter["type"])
require.Len(t, resp.PredefinedFilter.Sort, 1)
require.Equal(t, "last_message_at", resp.PredefinedFilter.Sort[0].Field)
require.Equal(t, -1, resp.PredefinedFilter.Sort[0].Direction)
}

func TestQueryChannelsResponse_NoPredefinedFilter(t *testing.T) {
// Test that response without predefined_filter has nil PredefinedFilter
jsonData := `{
"channels": [],
"duration": "0.01s"
}`

var resp queryChannelResponse
err := json.Unmarshal([]byte(jsonData), &resp)
require.NoError(t, err)

require.Nil(t, resp.PredefinedFilter)
}

func TestClient_QueryFlagReportsAndReview(t *testing.T) {
c := initClient(t)
ch := initChannel(t, c)
Expand Down