Joffrey JAFFEUX 671e6066bf
DEV: adds first_messages/last_messages to thread SDK (#26861)
This commit introduces several enhancements to the ChatSDK module, aiming to improve the functionality and usability of chat thread interactions. Here's what has been changed and added:

1. **New Method: `first_messages`:**
   - Added a method to retrieve the first set of messages from a specified chat thread.
   - This method is particularly useful for fetching initial messages when entering a chat thread.
   - Parameters include `thread_id`, `guardian`, and an optional `page_size` which defaults to 10.
   - Usage example added to demonstrate fetching the first 15 messages from a thread.

2. **New Method: `last_messages`:**
   - Added a method to retrieve the last set of messages from a specified chat thread.
   - This method supports reverse pagination, where the user may want to see the most recent messages first.
   - Similar to `first_messages`, it accepts `thread_id`, `guardian`, and an optional `page_size` parameter, defaulting to 10.
   - Usage example provided to illustrate fetching the last 20 messages from a thread.
2024-05-03 17:30:39 +02:00

116 lines
4.7 KiB
Ruby

# frozen_string_literal: true
module ChatSDK
class Thread
include WithServiceHelper
# Updates the title of a specified chat thread.
#
# @param title [String] The new title for the chat thread.
# @param thread_id [Integer] The ID of the chat thread to be updated.
# @param guardian [Guardian] The guardian object representing the user's permissions.
# @return [Chat::Thread] The updated thread object with the new title.
#
# @example Updating the title of a chat thread
# ChatSDK::Thread.update_title(title: "New Thread Title", thread_id: 1, guardian: Guardian.new)
#
def self.update_title(thread_id:, guardian:, title:)
new.update(title: title, thread_id: thread_id, guardian: guardian)
end
# Retrieves messages from a specified thread.
#
# @param thread_id [Integer] The ID of the chat thread from which to fetch messages.
# @param guardian [Guardian] The guardian object representing the user's permissions.
# @return [Array<Chat::Message>] An array of message objects from the specified thread.
#
# @example Fetching messages from a thread with additional parameters
# ChatSDK::Thread.messages(thread_id: 1, guardian: Guardian.new)
#
def self.messages(thread_id:, guardian:, **params)
new.messages(thread_id: thread_id, guardian: guardian, **params)
end
# Fetches the first messages from a specified chat thread, starting from the first available message.
#
# @param thread_id [Integer] The ID of the chat thread from which to fetch messages.
# @param guardian [Guardian] The guardian object representing the user's permissions.
# @param page_size [Integer] (optional) The number of messages to fetch, defaults to 10.
# @return [Array<Chat::Message>] An array of message objects representing the first messages in the thread.
#
# @example Fetching the first 15 messages from a thread
# ChatSDK::Thread.first_messages(thread_id: 1, guardian: Guardian.new, page_size: 15)
#
def self.first_messages(thread_id:, guardian:, page_size: 10)
new.messages(
thread_id: thread_id,
guardian: guardian,
page_size: page_size,
direction: "future",
fetch_from_first_message: true,
)
end
# Fetches the last messages from a specified chat thread, starting from the last available message.
#
# @param thread_id [Integer] The ID of the chat thread from which to fetch messages.
# @param guardian [Guardian] The guardian object representing the user's permissions.
# @param page_size [Integer] (optional) The number of messages to fetch, defaults to 10.
# @return [Array<Chat::Message>] An array of message objects representing the last messages in the thread.
#
# @example Fetching the last 20 messages from a thread
# ChatSDK::Thread.last_messages(thread_id: 2, guardian: Guardian.new, page_size: 20)
#
def self.last_messages(thread_id:, guardian:, page_size: 10)
new.messages(
thread_id: thread_id,
guardian: guardian,
page_size: page_size,
direction: "past",
fetch_from_last_message: true,
)
end
def self.update(**params)
new.update(**params)
end
def messages(thread_id:, guardian:, direction: "future", **params)
with_service(
Chat::ListChannelThreadMessages,
thread_id: thread_id,
guardian: guardian,
direction: direction,
**params,
) do
on_success { result.messages }
on_failed_policy(:can_view_thread) { raise "Guardian can't view thread" }
on_failed_policy(:target_message_exists) { raise "Target message doesn't exist" }
on_failed_policy(:ensure_thread_enabled) do
raise "Threading is not enabled for this channel"
end
on_failure { raise "Unexpected error" }
end
end
def update(**params)
with_service(Chat::UpdateThread, **params) do
on_model_not_found(:channel) do
raise "Couldn’t find channel with id: `#{params[:channel_id]}`"
end
on_model_not_found(:thread) do
raise "Couldn’t find thread with id: `#{params[:thread_id]}`"
end
on_failed_policy(:can_view_channel) { raise "Guardian can't view channel" }
on_failed_policy(:can_edit_thread) { raise "Guardian can't edit thread" }
on_failed_policy(:threading_enabled_for_channel) do
raise "Threading is not enabled for this channel"
end
on_failed_contract { |contract| raise contract.errors.full_messages.join(", ") }
on_success { result.thread_instance }
on_failure { raise "Unexpected error" }
end
end
end
end