Skip to content

Commit 5cfdcc6

Browse files
authored
Feature: Search endpoint improvements (#49)
1 parent 64f5ebb commit 5cfdcc6

File tree

2 files changed

+52
-12
lines changed

2 files changed

+52
-12
lines changed

lib/stream-chat/client.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,21 @@ def get_message(id)
9292
get("messages/#{id}")
9393
end
9494

95-
def search(filter_conditions, query, **options)
96-
params = options.merge({
97-
filter_conditions: filter_conditions,
98-
query: query
99-
})
100-
101-
get('search', params: { payload: params.to_json })
95+
def search(filter_conditions, query, sort: nil, **options)
96+
offset = options[:offset]
97+
next_value = options[:next]
98+
raise ArgumentError, 'cannot use offset with next or sort parameters' if offset&.positive? && (next_value || (!sort.nil? && !sort.empty?))
99+
100+
to_merge = {
101+
filter_conditions: filter_conditions,
102+
sort: get_sort_fields(sort)
103+
}
104+
if query.is_a? String
105+
to_merge[:query] = query
106+
else
107+
to_merge[:message_filter_conditions] = query
108+
end
109+
get('search', params: { payload: options.merge(to_merge).to_json })
102110
end
103111

104112
def update_users(users)

spec/client_spec.rb

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,43 @@
253253
end
254254
end
255255

256-
it 'search for messages' do
257-
text = SecureRandom.uuid
258-
@channel.send_message({ text: text }, 'legolas')
259-
resp = @client.search({ members: { '$in' => ['legolas'] } }, text)
260-
expect(resp['results'].length).to eq(1)
256+
describe 'search' do
257+
it 'search for messages' do
258+
text = SecureRandom.uuid
259+
@channel.send_message({ text: text }, 'legolas')
260+
resp = @client.search({ members: { '$in' => ['legolas'] } }, text)
261+
expect(resp['results'].length).to eq(1)
262+
end
263+
it 'search for messages with filter conditions' do
264+
text = SecureRandom.uuid
265+
@channel.send_message({ text: text }, 'legolas')
266+
resp = @client.search({ members: { '$in' => ['legolas'] } }, { text: { '$q': text } })
267+
expect(resp['results'].length).to eq(1)
268+
end
269+
it 'offset with sort should fail' do
270+
expect do
271+
@client.search({ members: { '$in' => ['legolas'] } }, SecureRandom.uuid, sort: [{ created_at: -1 }], offset: 2)
272+
end.to raise_error(/cannot use offset with next or sort parameters/)
273+
end
274+
it 'offset with next should fail' do
275+
expect do
276+
@client.search({ members: { '$in' => ['legolas'] } }, SecureRandom.uuid, offset: 2, next: SecureRandom.uuid)
277+
end.to raise_error(/cannot use offset with next or sort parameters/)
278+
end
279+
xit 'search for messages with sorting' do
280+
text = SecureRandom.uuid
281+
message_ids = ["0-#{text}", "1-#{text}"]
282+
@channel.send_message({ id: message_ids[0], text: text }, 'legolas')
283+
@channel.send_message({ id: message_ids[1], text: text }, 'legolas')
284+
page1 = @client.search({ members: { '$in' => ['legolas'] } }, text, sort: [{ created_at: -1 }], limit: 1)
285+
expect(page1['results'].length).to eq
286+
expect(page1['results'][0]['message']['id']).to eq(message_ids[1])
287+
expect(page1['next']).not_to be_empty
288+
page2 = @client.search({ members: { '$in' => ['legolas'] } }, text, limit: 1, next: page1['next'])
289+
expect(page2['results'].length).to eq(1)
290+
expect(page2['results'][0]['message']['id']).to eq(message_ids[0])
291+
expect(page2['previous']).not_to be_empty
292+
end
261293
end
262294

263295
describe 'blocklist' do

0 commit comments

Comments
 (0)