From 3ff3f45e30d9c29f99932565af2f537f0608a5d4 Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Mon, 22 Dec 2025 11:25:19 +0100 Subject: [PATCH] [CHA-1610] Add support channels batch update --- lib/stream-chat/channel_batch_updater.rb | 211 +++++++++++++++++++++++ lib/stream-chat/client.rb | 15 ++ 2 files changed, 226 insertions(+) create mode 100644 lib/stream-chat/channel_batch_updater.rb diff --git a/lib/stream-chat/channel_batch_updater.rb b/lib/stream-chat/channel_batch_updater.rb new file mode 100644 index 0000000..c29472b --- /dev/null +++ b/lib/stream-chat/channel_batch_updater.rb @@ -0,0 +1,211 @@ +# typed: strict +# frozen_string_literal: true + +require 'stream-chat/client' +require 'stream-chat/stream_response' +require 'stream-chat/types' + +module StreamChat + class ChannelBatchUpdater + extend T::Sig + + sig { params(client: StreamChat::Client).void } + def initialize(client) + @client = client + end + + # Member operations + + # addMembers - Add members to channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T.any(T::Array[String], T::Array[StringKeyHash])] Members to add + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T.any(T::Array[String], T::Array[StringKeyHash])).returns(StreamChat::StreamResponse) } + def add_members(filter, members) + @client.update_channels_batch( + { + operation: 'addMembers', + filter: filter, + members: members + } + ) + end + + # removeMembers - Remove members from channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T::Array[String]] Member IDs to remove + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T::Array[String]).returns(StreamChat::StreamResponse) } + def remove_members(filter, members) + @client.update_channels_batch( + { + operation: 'removeMembers', + filter: filter, + members: members + } + ) + end + + # inviteMembers - Invite members to channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T.any(T::Array[String], T::Array[StringKeyHash])] Members to invite + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T.any(T::Array[String], T::Array[StringKeyHash])).returns(StreamChat::StreamResponse) } + def invite_members(filter, members) + @client.update_channels_batch( + { + operation: 'invites', + filter: filter, + members: members + } + ) + end + + # addModerators - Add moderators to channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T::Array[String]] Member IDs to promote to moderator + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T::Array[String]).returns(StreamChat::StreamResponse) } + def add_moderators(filter, members) + @client.update_channels_batch( + { + operation: 'addModerators', + filter: filter, + members: members + } + ) + end + + # demoteModerators - Remove moderator role from members in channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T::Array[String]] Member IDs to demote + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T::Array[String]).returns(StreamChat::StreamResponse) } + def demote_moderators(filter, members) + @client.update_channels_batch( + { + operation: 'demoteModerators', + filter: filter, + members: members + } + ) + end + + # assignRoles - Assign roles to members in channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param members [T::Array[StringKeyHash]] Members with role assignments + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, members: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) } + def assign_roles(filter, members) + @client.update_channels_batch( + { + operation: 'assignRoles', + filter: filter, + members: members + } + ) + end + + # Visibility operations + + # hide - Hide channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) } + def hide(filter) + @client.update_channels_batch( + { + operation: 'hide', + filter: filter + } + ) + end + + # show - Show channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) } + def show(filter) + @client.update_channels_batch( + { + operation: 'show', + filter: filter + } + ) + end + + # archive - Archive channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) } + def archive(filter) + @client.update_channels_batch( + { + operation: 'archive', + filter: filter + } + ) + end + + # unarchive - Unarchive channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) } + def unarchive(filter) + @client.update_channels_batch( + { + operation: 'unarchive', + filter: filter + } + ) + end + + # Data operations + + # updateData - Update data on channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param data [StringKeyHash] Data to update + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, data: StringKeyHash).returns(StreamChat::StreamResponse) } + def update_data(filter, data) + @client.update_channels_batch( + { + operation: 'updateData', + filter: filter, + data: data + } + ) + end + + # addFilterTags - Add filter tags to channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param tags [T::Array[String]] Tags to add + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, tags: T::Array[String]).returns(StreamChat::StreamResponse) } + def add_filter_tags(filter, tags) + @client.update_channels_batch( + { + operation: 'addFilterTags', + filter: filter, + filter_tags_update: tags + } + ) + end + + # removeFilterTags - Remove filter tags from channels matching the filter + # @param filter [StringKeyHash] Filter to select channels + # @param tags [T::Array[String]] Tags to remove + # @return [StreamChat::StreamResponse] The server response + sig { params(filter: StringKeyHash, tags: T::Array[String]).returns(StreamChat::StreamResponse) } + def remove_filter_tags(filter, tags) + @client.update_channels_batch( + { + operation: 'removeFilterTags', + filter: filter, + filter_tags_update: tags + } + ) + end + end +end + diff --git a/lib/stream-chat/client.rb b/lib/stream-chat/client.rb index 1f46789..4ec19db 100644 --- a/lib/stream-chat/client.rb +++ b/lib/stream-chat/client.rb @@ -1074,6 +1074,21 @@ def mark_delivered(data = nil, user_id: nil) post('channels/delivered', data: data || {}, params: { user_id: user_id }) end + # Update channels in batch. + # @param payload [StringKeyHash] Payload containing operation, filter, and optional members/data/filter_tags_update + # @return [StreamChat::StreamResponse] API response + sig { params(payload: StringKeyHash).returns(StreamChat::StreamResponse) } + def update_channels_batch(payload) + put('channels/batch', data: payload) + end + + # Returns a ChannelBatchUpdater instance for batch channel operations. + # @return [StreamChat::ChannelBatchUpdater] A ChannelBatchUpdater instance + sig { returns(StreamChat::ChannelBatchUpdater) } + def channel_batch_updater + ChannelBatchUpdater.new(self) + end + private sig { returns(T::Hash[String, String]) }