From f3ee91bb620e82ae62624574c738911f3c2638a9 Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Thu, 26 Jun 2025 18:35:32 +0200 Subject: [PATCH 1/6] added unread count --- lib/stream-chat/client.rb | 6 ++++++ spec/client_spec.rb | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/stream-chat/client.rb b/lib/stream-chat/client.rb index bf5e60e..e759496 100644 --- a/lib/stream-chat/client.rb +++ b/lib/stream-chat/client.rb @@ -360,6 +360,12 @@ def mark_all_read(user_id) post('channels/read', data: payload) end + # Get unread count for a user. + sig { params(user_id: String).returns(StreamChat::StreamResponse) } + def get_unread_count(user_id) + get("/unread", params: { user_id: user_id }) + end + # Pins a message. # # Pinned messages allow users to highlight important messages, make announcements, or temporarily diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 31d116d..88d7c5f 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -546,6 +546,39 @@ def loop_times(times) end end + describe 'unread count' do + before(:all) do + @user_id = SecureRandom.uuid + @client.update_users([{ id: @user_id }]) + @channel.add_members([@user_id]) + end + + before(:each) do + @client.mark_all_read(@user_id) + end + + it 'gets unread count' do + resp = @client.get_unread_count(@user_id) + expect(resp['total_unread_count']).to eq 0 + end + + it "gets unread count if there are unread messages" do + @channel.send_message({ text: 'Hello world' }, @random_user[:id]) + resp = @client.get_unread_count(@user_id) + expect(resp['total_unread_count']).to eq 1 + end + + it "gets unread count for a channel" do + @message = @channel.send_message({ text: 'Hello world' }, @random_user[:id]) + resp = @client.get_unread_count(@user_id) + expect(resp['total_unread_count']).to eq 1 + expect(resp['channels'].length).to eq 1 + expect(resp['channels'][0]['channel_id']).to eq @channel.cid + expect(resp['channels'][0]['unread_count']).to eq 1 + expect(resp['channels'][0]['last_read']).not_to be_nil + end + end + describe 'blocklist' do before(:all) do @blocklist = SecureRandom.uuid From dadd7b4ce47fe8503da341d0c46814e5a9a1e477 Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Thu, 26 Jun 2025 18:56:01 +0200 Subject: [PATCH 2/6] feature: added unread_count and fixed linting errors --- lib/stream-chat/client.rb | 2 +- spec/client_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/stream-chat/client.rb b/lib/stream-chat/client.rb index e759496..d954a99 100644 --- a/lib/stream-chat/client.rb +++ b/lib/stream-chat/client.rb @@ -363,7 +363,7 @@ def mark_all_read(user_id) # Get unread count for a user. sig { params(user_id: String).returns(StreamChat::StreamResponse) } def get_unread_count(user_id) - get("/unread", params: { user_id: user_id }) + get('/unread', params: { user_id: user_id }) end # Pins a message. diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 88d7c5f..4913e01 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -562,13 +562,13 @@ def loop_times(times) expect(resp['total_unread_count']).to eq 0 end - it "gets unread count if there are unread messages" do + it 'gets unread count if there are unread messages' do @channel.send_message({ text: 'Hello world' }, @random_user[:id]) resp = @client.get_unread_count(@user_id) expect(resp['total_unread_count']).to eq 1 end - it "gets unread count for a channel" do + it 'gets unread count for a channel' do @message = @channel.send_message({ text: 'Hello world' }, @random_user[:id]) resp = @client.get_unread_count(@user_id) expect(resp['total_unread_count']).to eq 1 From e631e888770864bb11b69871f02cde31d32fa6e0 Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Mon, 30 Jun 2025 10:48:51 +0200 Subject: [PATCH 3/6] feature: renamed the feature to be more inline with other SDKs --- lib/stream-chat/client.rb | 6 +++++- spec/client_spec.rb | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/stream-chat/client.rb b/lib/stream-chat/client.rb index d954a99..375dfe3 100644 --- a/lib/stream-chat/client.rb +++ b/lib/stream-chat/client.rb @@ -362,10 +362,14 @@ def mark_all_read(user_id) # Get unread count for a user. sig { params(user_id: String).returns(StreamChat::StreamResponse) } - def get_unread_count(user_id) + def unread_counts(user_id) get('/unread', params: { user_id: user_id }) end + def unread_counts_batch(user_ids) + post('/unread_batch', data: { user_ids: user_ids }) + end + # Pins a message. # # Pinned messages allow users to highlight important messages, make announcements, or temporarily diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 4913e01..19bc451 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -558,19 +558,19 @@ def loop_times(times) end it 'gets unread count' do - resp = @client.get_unread_count(@user_id) + resp = @client.unread_counts(@user_id) expect(resp['total_unread_count']).to eq 0 end it 'gets unread count if there are unread messages' do @channel.send_message({ text: 'Hello world' }, @random_user[:id]) - resp = @client.get_unread_count(@user_id) + resp = @client.unread_counts(@user_id) expect(resp['total_unread_count']).to eq 1 end it 'gets unread count for a channel' do @message = @channel.send_message({ text: 'Hello world' }, @random_user[:id]) - resp = @client.get_unread_count(@user_id) + resp = @client.unread_counts(@user_id) expect(resp['total_unread_count']).to eq 1 expect(resp['channels'].length).to eq 1 expect(resp['channels'][0]['channel_id']).to eq @channel.cid @@ -579,6 +579,39 @@ def loop_times(times) end end + describe 'unread counts batch' do + before(:all) do + @user_id1 = SecureRandom.uuid + @user_id2 = SecureRandom.uuid + @client.update_users([{ id: @user_id1 }, { id: @user_id2 }]) + @channel.add_members([@user_id1, @user_id2]) + end + + before(:each) do + @client.mark_all_read(@user_id1) + @client.mark_all_read(@user_id2) + end + + + it 'gets unread counts for a batch of users' do + resp = @client.unread_counts_batch([@user_id1, @user_id2]) + expect(resp['counts_by_user'].length).to eq 0 + end + + it 'gets unread counts for a batch of users with unread messages' do + @channel.send_message({ text: 'Hello world' }, @user_id1) + @channel.send_message({ text: 'Hello world' }, @user_id2) + + resp = @client.unread_counts_batch([@user_id1, @user_id2]) + expect(resp['counts_by_user'].length).to eq 2 + expect(resp['counts_by_user'][@user_id1]['total_unread_count']).to eq 1 + expect(resp['counts_by_user'][@user_id2]['total_unread_count']).to eq 1 + expect(resp['counts_by_user'][@user_id1]['channels'].length).to eq 1 + expect(resp['counts_by_user'][@user_id2]['channels'].length).to eq 1 + expect(resp['counts_by_user'][@user_id1]['channels'][0]['channel_id']).to eq @channel.cid + end + end + describe 'blocklist' do before(:all) do @blocklist = SecureRandom.uuid From d33cc81c0f99b12591b1c2f48b98740484ed2fb4 Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Mon, 30 Jun 2025 10:49:35 +0200 Subject: [PATCH 4/6] chore: added sorbet type checking --- lib/stream-chat/client.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/stream-chat/client.rb b/lib/stream-chat/client.rb index 375dfe3..844e7db 100644 --- a/lib/stream-chat/client.rb +++ b/lib/stream-chat/client.rb @@ -366,6 +366,8 @@ def unread_counts(user_id) get('/unread', params: { user_id: user_id }) end + # Get unread counts for a batch of users. + sig { params(user_ids: T::Array[String]).returns(StreamChat::StreamResponse) } def unread_counts_batch(user_ids) post('/unread_batch', data: { user_ids: user_ids }) end From 7dd520ebb2dcc74135ff5851916fdf0d70ba861f Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Mon, 30 Jun 2025 10:50:09 +0200 Subject: [PATCH 5/6] core: linting errors fix --- spec/client_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 19bc451..eb8208e 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -592,12 +592,11 @@ def loop_times(times) @client.mark_all_read(@user_id2) end - it 'gets unread counts for a batch of users' do resp = @client.unread_counts_batch([@user_id1, @user_id2]) expect(resp['counts_by_user'].length).to eq 0 end - + it 'gets unread counts for a batch of users with unread messages' do @channel.send_message({ text: 'Hello world' }, @user_id1) @channel.send_message({ text: 'Hello world' }, @user_id2) From ac1e2bee8ee13093c576dcebbea7c46a18c371d6 Mon Sep 17 00:00:00 2001 From: nijeeshjoshy Date: Mon, 30 Jun 2025 11:16:27 +0200 Subject: [PATCH 6/6] chore: added isloation for the unread count specs --- spec/client_spec.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/client_spec.rb b/spec/client_spec.rb index eb8208e..b970893 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -550,6 +550,8 @@ def loop_times(times) before(:all) do @user_id = SecureRandom.uuid @client.update_users([{ id: @user_id }]) + @channel = @client.channel('team', channel_id: SecureRandom.uuid) + @channel.create(@user_id) @channel.add_members([@user_id]) end @@ -584,6 +586,8 @@ def loop_times(times) @user_id1 = SecureRandom.uuid @user_id2 = SecureRandom.uuid @client.update_users([{ id: @user_id1 }, { id: @user_id2 }]) + @channel = @client.channel('team', channel_id: SecureRandom.uuid) + @channel.create(@user_id1) @channel.add_members([@user_id1, @user_id2]) end