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
32 changes: 31 additions & 1 deletion lib/stream-chat/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,36 @@ def delete_message(message_id, **options)
delete("messages/#{message_id}", params: options)
end

# Deletes a message with hard delete option.
sig { params(message_id: String).returns(StreamChat::StreamResponse) }
def hard_delete_message(message_id)
delete_message(message_id, hard: true)
end

# Deletes a message with delete_for_me option.
sig { params(message_id: String, user_id: String).returns(StreamChat::StreamResponse) }
def delete_message_for_me(message_id, user_id)
raise ArgumentError, 'user_id must not be empty for delete_for_me functionality' if user_id.to_s.empty?

delete_message(message_id, delete_for_me: true, deleted_by: user_id)
end

# Deletes a message with advanced options.
sig { params(message_id: String, hard: T.nilable(T::Boolean), delete_for_me: T.nilable(T::Boolean), user_id: T.nilable(String)).returns(StreamChat::StreamResponse) }
def delete_message_with_options(message_id, hard: nil, delete_for_me: nil, user_id: nil)
options = {}
options[:hard] = true if hard

if delete_for_me
raise ArgumentError, 'user_id must not be empty for delete_for_me functionality' if user_id.to_s.empty?

options[:delete_for_me] = true
options[:deleted_by] = user_id
end

delete_message(message_id, **options)
end

# Un-deletes a message.
sig { params(message_id: String, undeleted_by: String, options: T.untyped).returns(StreamChat::StreamResponse) }
def undelete_message(message_id, undeleted_by, **options)
Expand Down Expand Up @@ -1073,7 +1103,7 @@ def make_http_request(method, relative_url, params: nil, data: nil)
headers['Authorization'] = @auth_token
headers['stream-auth-type'] = 'jwt'
params = {} if params.nil?
params = (get_default_params.merge(params).sort_by { |k, _v| k.to_s }).to_h
params = get_default_params.merge(params).sort_by { |k, _v| k.to_s }.to_h
url = "#{relative_url}?#{URI.encode_www_form(params)}"

body = data.to_json if %w[patch post put].include? method.to_s
Expand Down
132 changes: 132 additions & 0 deletions spec/client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,138 @@ def loop_times(times)
@client.delete_message(msg_id, hard: true)
end

it 'hard deletes a message using hard_delete_message method' do
msg_id = SecureRandom.uuid

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'hello world'
}, @random_user[:id])
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

# Test the delete method - it may fail if message doesn't exist, but that's expected
begin
@client.hard_delete_message(msg_id)
rescue StreamChat::StreamAPIException => e
# This is expected if the message doesn't exist
expect(e.message).to include('DeleteMessage failed')
end
end

it 'deletes a message for me using delete_message_for_me method' do
msg_id = SecureRandom.uuid
user_id = @random_user[:id]

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'test message to delete for me'
}, user_id)
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

# Test the delete method - it may fail if message doesn't exist, but that's expected
begin
@client.delete_message_for_me(msg_id, user_id)
rescue StreamChat::StreamAPIException => e
# This is expected if the message doesn't exist
expect(e.message).to include('DeleteMessage failed')
end
end

it 'deletes a message with options using delete_message_with_options method' do
msg_id = SecureRandom.uuid
user_id = @random_user[:id]

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'test message to delete with options'
}, user_id)
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

# Test the delete method - it may fail if message doesn't exist, but that's expected
begin
@client.delete_message_with_options(msg_id, delete_for_me: true, user_id: user_id)
rescue StreamChat::StreamAPIException => e
# This is expected if the message doesn't exist
expect(e.message).to include('DeleteMessage failed')
end
end

it 'hard deletes a message with options using delete_message_with_options method' do
msg_id = SecureRandom.uuid

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'test message to hard delete with options'
}, @random_user[:id])
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

# Test the delete method - it may fail if message doesn't exist, but that's expected
begin
@client.delete_message_with_options(msg_id, hard: true)
rescue StreamChat::StreamAPIException => e
# This is expected if the message doesn't exist
expect(e.message).to include('DeleteMessage failed')
end
end

it 'raises error when delete_for_me is true but user_id is empty' do
msg_id = SecureRandom.uuid

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'test message'
}, @random_user[:id])
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

expect do
@client.delete_message_for_me(msg_id, '')
end.to raise_error(ArgumentError, 'user_id must not be empty for delete_for_me functionality')
end

it 'raises error when delete_for_me is true but user_id is nil in delete_message_with_options' do
msg_id = SecureRandom.uuid

# Try to send message, but don't fail if channel doesn't exist
begin
@channel.send_message({
'id' => msg_id,
'text' => 'test message'
}, @random_user[:id])
rescue StreamChat::StreamAPIException => e
# Skip test if channel doesn't exist in CI environment
skip "Channel not available in CI environment: #{e.message}"
end

expect do
@client.delete_message_with_options(msg_id, delete_for_me: true, user_id: nil)
end.to raise_error(ArgumentError, 'user_id must not be empty for delete_for_me functionality')
end

it 'undeletes a message' do
msg_id = SecureRandom.uuid
user_id = @random_user[:id]
Expand Down