Skip to content

Commit 31b0325

Browse files
[CHA-2354] Add ParsedPredefinedFilterResponse to QueryChannels response
Add struct and response field for the new `predefined_filter` property returned in QueryChannels responses when a predefined filter is used. - Added ParsedPredefinedFilterResponse struct - Updated queryChannelResponse and QueryChannelsResponse - Added unit tests for JSON unmarshaling Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent cb9c110 commit 31b0325

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

query.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,17 @@ func (c *Client) QueryUsers(ctx context.Context, q *QueryUsersOptions, sorters .
9494
return &resp, err
9595
}
9696

97+
// ParsedPredefinedFilterResponse contains the interpolated filter and sort from a predefined filter.
98+
// This is returned in the QueryChannels response when using a predefined filter.
99+
type ParsedPredefinedFilterResponse struct {
100+
Name string `json:"name"`
101+
Filter map[string]interface{} `json:"filter"`
102+
Sort []*SortOption `json:"sort,omitempty"`
103+
}
104+
97105
type queryChannelResponse struct {
98-
Channels []queryChannelResponseData `json:"channels"`
106+
Channels []queryChannelResponseData `json:"channels"`
107+
PredefinedFilter *ParsedPredefinedFilterResponse `json:"predefined_filter,omitempty"`
99108
Response
100109
}
101110

@@ -113,7 +122,8 @@ type queryChannelResponseData struct {
113122
}
114123

115124
type QueryChannelsResponse struct {
116-
Channels []*Channel
125+
Channels []*Channel
126+
PredefinedFilter *ParsedPredefinedFilterResponse
117127
Response
118128
}
119129

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

160-
return &QueryChannelsResponse{Channels: result, Response: resp.Response}, nil
170+
return &QueryChannelsResponse{
171+
Channels: result,
172+
PredefinedFilter: resp.PredefinedFilter,
173+
Response: resp.Response,
174+
}, nil
161175
}
162176

163177
type SearchRequest struct {

query_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package stream_chat
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"testing"
78
"time"
@@ -320,6 +321,45 @@ func TestClient_QueryMessageFlags(t *testing.T) {
320321
assert.Len(t, got.Flags, 1)
321322
}
322323

324+
func TestQueryChannelsResponse_ParsedPredefinedFilter(t *testing.T) {
325+
// Test that ParsedPredefinedFilterResponse is correctly unmarshaled from JSON
326+
jsonData := `{
327+
"channels": [],
328+
"predefined_filter": {
329+
"name": "user_messaging",
330+
"filter": {"type": "messaging", "members": {"$in": ["user123"]}},
331+
"sort": [{"field": "last_message_at", "direction": -1}]
332+
},
333+
"duration": "0.01s"
334+
}`
335+
336+
var resp queryChannelResponse
337+
err := json.Unmarshal([]byte(jsonData), &resp)
338+
require.NoError(t, err)
339+
340+
require.NotNil(t, resp.PredefinedFilter)
341+
require.Equal(t, "user_messaging", resp.PredefinedFilter.Name)
342+
require.NotNil(t, resp.PredefinedFilter.Filter)
343+
require.Equal(t, "messaging", resp.PredefinedFilter.Filter["type"])
344+
require.Len(t, resp.PredefinedFilter.Sort, 1)
345+
require.Equal(t, "last_message_at", resp.PredefinedFilter.Sort[0].Field)
346+
require.Equal(t, -1, resp.PredefinedFilter.Sort[0].Direction)
347+
}
348+
349+
func TestQueryChannelsResponse_NoPredefinedFilter(t *testing.T) {
350+
// Test that response without predefined_filter has nil PredefinedFilter
351+
jsonData := `{
352+
"channels": [],
353+
"duration": "0.01s"
354+
}`
355+
356+
var resp queryChannelResponse
357+
err := json.Unmarshal([]byte(jsonData), &resp)
358+
require.NoError(t, err)
359+
360+
require.Nil(t, resp.PredefinedFilter)
361+
}
362+
323363
func TestClient_QueryFlagReportsAndReview(t *testing.T) {
324364
c := initClient(t)
325365
ch := initChannel(t, c)

0 commit comments

Comments
 (0)