Skip to content

Commit 38a649d

Browse files
Added the support for message reminders feature
* `create_reminder`: Create a reminder for a message * `update_reminder`: Update an existing reminder * `delete_reminder`: Delete a reminder * `query_reminders`: Query reminders with filtering options
1 parent ac11fc1 commit 38a649d

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
44

5+
## [Unreleased]
6+
7+
### Features
8+
9+
* Added support for message reminders:
10+
* `create_reminder`: Create a reminder for a message
11+
* `update_reminder`: Update an existing reminder
12+
* `delete_reminder`: Delete a reminder
13+
* `query_reminders`: Query reminders with filtering options
14+
515
## [3.10.0](https://github.com/GetStream/stream-chat-ruby/compare/v3.9.0...v3.10.0) (2025-02-24)
616

717
## [3.9.0](https://github.com/GetStream/stream-chat-ruby/compare/v3.7.0...v3.9.0) (2025-02-11)

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,29 @@ deleted_message = client.delete_message(m1['message']['id'])
132132

133133
```
134134

135+
### Reminders
136+
137+
```ruby
138+
# Create a reminder for a message
139+
reminder = client.create_reminder(m1['message']['id'], 'bob-1', DateTime.now + 1)
140+
141+
# Create a reminder without a notification time (just mark for later)
142+
reminder = client.create_reminder(m1['message']['id'], 'bob-1')
143+
144+
# Update a reminder
145+
updated_reminder = client.update_reminder(m1['message']['id'], 'bob-1', DateTime.now + 2)
146+
147+
# Delete a reminder
148+
client.delete_reminder(m1['message']['id'], 'bob-1')
149+
150+
# Query reminders for a user
151+
reminders = client.query_reminders('bob-1')
152+
153+
# Query reminders with filters
154+
filter = { 'channel_cid' => 'messaging:bob-and-jane' }
155+
reminders = client.query_reminders('bob-1', filter)
156+
```
157+
135158
### Devices
136159

137160
```ruby

lib/stream-chat/client.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require 'faraday/net_http_persistent'
88
require 'jwt'
99
require 'time'
10+
require 'date'
1011
require 'sorbet-runtime'
1112
require 'stream-chat/channel'
1213
require 'stream-chat/errors'
@@ -900,6 +901,55 @@ def list_imports(options)
900901
get('imports', params: options)
901902
end
902903

904+
# Creates a reminder for a message.
905+
# @param message_id [String] The ID of the message to create a reminder for
906+
# @param user_id [String] The ID of the user creating the reminder
907+
# @param remind_at [DateTime, nil] When to remind the user (optional)
908+
# @return [StreamChat::StreamResponse] API response
909+
sig { params(message_id: String, user_id: String, remind_at: T.nilable(DateTime)).returns(StreamChat::StreamResponse) }
910+
def create_reminder(message_id, user_id, remind_at = nil)
911+
data = { user_id: user_id }
912+
data[:remind_at] = T.cast(remind_at, DateTime).rfc3339 if remind_at.instance_of?(DateTime)
913+
post("messages/#{message_id}/reminders", data: data)
914+
end
915+
916+
# Updates a reminder for a message.
917+
# @param message_id [String] The ID of the message with the reminder
918+
# @param user_id [String] The ID of the user who owns the reminder
919+
# @param remind_at [DateTime, nil] When to remind the user (optional)
920+
# @return [StreamChat::StreamResponse] API response
921+
sig { params(message_id: String, user_id: String, remind_at: T.nilable(DateTime)).returns(StreamChat::StreamResponse) }
922+
def update_reminder(message_id, user_id, remind_at = nil)
923+
data = { user_id: user_id }
924+
data[:remind_at] = remind_at.rfc3339 if remind_at
925+
patch("messages/#{message_id}/reminders", data: data)
926+
end
927+
928+
# Deletes a reminder for a message.
929+
# @param message_id [String] The ID of the message with the reminder
930+
# @param user_id [String] The ID of the user who owns the reminder
931+
# @return [StreamChat::StreamResponse] API response
932+
sig { params(message_id: String, user_id: String).returns(StreamChat::StreamResponse) }
933+
def delete_reminder(message_id, user_id)
934+
delete("messages/#{message_id}/reminders", params: { user_id: user_id })
935+
end
936+
937+
# Queries reminders based on filter conditions.
938+
# @param user_id [String] The ID of the user whose reminders to query
939+
# @param filter_conditions [Hash] Conditions to filter reminders
940+
# @param sort [Array<Hash>, nil] Sort parameters (default: [{ field: 'remind_at', direction: 1 }])
941+
# @param options [Hash] Additional query options like limit, offset
942+
# @return [StreamChat::StreamResponse] API response with reminders
943+
sig { params(user_id: String, filter_conditions: T::Hash[T.untyped, T.untyped], sort: T.nilable(T::Array[T::Hash[T.untyped, T.untyped]]), options: T.untyped).returns(StreamChat::StreamResponse) }
944+
def query_reminders(user_id, filter_conditions = {}, sort: nil, **options)
945+
params = options.merge({
946+
filter_conditions: filter_conditions,
947+
sort: sort || [{ field: 'remind_at', direction: 1 }],
948+
user_id: user_id
949+
})
950+
post('reminders/query', data: params)
951+
end
952+
903953
private
904954

905955
sig { returns(T::Hash[String, String]) }

spec/client_spec.rb

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,4 +846,103 @@ def loop_times(times)
846846
end
847847
end
848848
end
849+
850+
describe 'reminders' do
851+
before do
852+
@client = StreamChat::Client.from_env
853+
@channel_id = SecureRandom.uuid
854+
@channel = @client.channel('messaging', channel_id: @channel_id)
855+
@channel.create('john')
856+
@message = @channel.send_message({ 'text' => 'Hello world' }, 'john')
857+
@message_id = @message['message']['id']
858+
@user_id = 'john'
859+
end
860+
861+
describe 'create_reminder' do
862+
it 'create reminder' do
863+
remind_at = DateTime.now + 1
864+
response = @client.create_reminder(@message_id, @user_id, remind_at)
865+
866+
expect(response).to include('reminder')
867+
expect(response['reminder']).to include('message_id', 'user_id', 'remind_at')
868+
expect(response['reminder']['message_id']).to eq(@message_id)
869+
expect(response['reminder']['user_id']).to eq(@user_id)
870+
end
871+
872+
it 'create reminder without remind_at' do
873+
response = @client.create_reminder(@message_id, @user_id)
874+
875+
expect(response).to include('reminder')
876+
expect(response['reminder']).to include('message_id', 'user_id')
877+
expect(response['reminder']['message_id']).to eq(@message_id)
878+
expect(response['reminder']['user_id']).to eq(@user_id)
879+
expect(response['reminder']['remind_at']).to be_nil
880+
end
881+
end
882+
883+
describe 'update_reminder' do
884+
before do
885+
@client.create_reminder(@message_id, @user_id)
886+
end
887+
888+
it 'update reminder' do
889+
890+
new_remind_at = DateTime.now + 2
891+
response = @client.update_reminder(@message_id, @user_id, new_remind_at)
892+
893+
expect(response).to include('reminder')
894+
expect(response['reminder']).to include('message_id', 'user_id', 'remind_at')
895+
expect(response['reminder']['message_id']).to eq(@message_id)
896+
expect(response['reminder']['user_id']).to eq(@user_id)
897+
expect(DateTime.parse(response['reminder']['remind_at'])).to be_within(1).of(new_remind_at)
898+
end
899+
end
900+
901+
describe 'delete_reminder' do
902+
before do
903+
@client.create_reminder(@message_id, @user_id)
904+
end
905+
906+
it 'delete reminder' do
907+
response = @client.delete_reminder(@message_id, @user_id)
908+
expect(response).to be_a(Hash)
909+
end
910+
end
911+
912+
describe 'query_reminders' do
913+
before do
914+
remind_at = DateTime.now + 1
915+
@client.create_reminder(@message_id, @user_id, remind_at)
916+
end
917+
918+
it 'query reminders' do
919+
# Query reminders for the user
920+
response = @client.query_reminders(@user_id)
921+
922+
expect(response).to include('reminders')
923+
expect(response['reminders']).to be_an(Array)
924+
expect(response['reminders'].length).to be >= 1
925+
926+
# Find our reminder
927+
reminder = response['reminders'].find { |r| r['message_id'] == @message_id }
928+
expect(reminder).not_to be_nil
929+
expect(reminder['user_id']).to eq(@user_id)
930+
end
931+
932+
it 'query reminders with channel filter' do
933+
# Query reminders for the user in a specific channel
934+
filter = { 'channel_cid' => @channel.cid }
935+
response = @client.query_reminders(@user_id, filter)
936+
937+
expect(response).to include('reminders')
938+
expect(response['reminders']).to be_an(Array)
939+
expect(response['reminders'].length).to be >= 1
940+
941+
# All reminders should have a channel_cid
942+
response['reminders'].each do |reminder|
943+
expect(reminder).to include('channel_cid')
944+
end
945+
end
946+
end
947+
end
849948
end

0 commit comments

Comments
 (0)