Skip to main content

lib/jido/chat/x/transport/xdk_client.ex

defmodule Jido.Chat.X.Transport.XdkClient do
  @moduledoc "XDK-backed transport for X Direct Messages."
  @behaviour Jido.Chat.X.Transport

  @impl true
  def send_dm(participant_id, text, opts) do
    client = client!(opts)
    Xdk.DirectMessages.create_by_participant_id(client, participant_id, %{"text" => text})
  rescue
    UndefinedFunctionError ->
      {:error, :xdk_dm_endpoint_missing}
  end

  @impl true
  def send_conversation_message(conversation_id, text, opts) do
    client = client!(opts)
    Xdk.DirectMessages.create_by_conversation_id(client, conversation_id, %{"text" => text})
  rescue
    UndefinedFunctionError ->
      {:error, :xdk_dm_endpoint_missing}
  end

  @impl true
  def delete_dm_event(event_id, opts) do
    client = client!(opts)

    case Xdk.DirectMessages.delete_events(client, event_id) do
      {:ok, _} -> :ok
      {:error, _} = error -> error
    end
  rescue
    UndefinedFunctionError ->
      {:error, :xdk_dm_endpoint_missing}
  end

  @impl true
  def fetch_dm_event(event_id, opts) do
    client = client!(opts)
    Xdk.DirectMessages.get_events_by_id(client, event_id, opts)
  rescue
    UndefinedFunctionError ->
      {:error, :xdk_dm_endpoint_missing}
  end

  @impl true
  def fetch_conversation_messages(conversation_id, opts) do
    client = client!(opts)
    Xdk.DirectMessages.get_events_by_conversation_id(client, conversation_id, opts)
  rescue
    UndefinedFunctionError ->
      {:error, :xdk_dm_endpoint_missing}
  end

  defp client!(opts) do
    Keyword.get(opts, :xdk_client) ||
      Keyword.get(opts, :client) ||
      raise ArgumentError, "missing :xdk_client option for X adapter transport"
  end
end