centralizing pubsub topics
Some checks failed
CI/CD Pipeline / build (push) Failing after 4s

This commit is contained in:
2026-03-13 15:29:20 -06:00
parent 0fd243d259
commit 927c19dd17
10 changed files with 75 additions and 17 deletions

View File

@@ -3,10 +3,9 @@ defmodule ElixirAi.ChatRunner do
use GenServer
import ElixirAi.ChatUtils, only: [ai_tool: 1]
alias ElixirAi.{Conversation, Message}
import ElixirAi.PubsubTopics
defp via(name), do: {:via, Horde.Registry, {ElixirAi.ChatRegistry, name}}
defp topic(name), do: "ai_chat:#{name}"
def message_topic(name), do: "conversation_messages:#{name}"
def new_user_message(name, text_content) do
GenServer.cast(via(name), {:user_message, text_content})
@@ -28,7 +27,7 @@ defmodule ElixirAi.ChatRunner do
def init(name) do
messages =
case Conversation.find_id(name) do
{:ok, conv_id} -> Message.load_for_conversation(conv_id, topic: message_topic(name))
{:ok, conv_id} -> Message.load_for_conversation(conv_id, topic: conversation_message_topic(name))
_ -> []
end
@@ -78,7 +77,7 @@ defmodule ElixirAi.ChatRunner do
function: fn %{"color" => color} ->
Phoenix.PubSub.broadcast(
ElixirAi.PubSub,
"ai_chat:#{name}",
chat_topic(name),
{:set_background_color, color}
)
end,
@@ -309,7 +308,7 @@ defmodule ElixirAi.ChatRunner do
{:reply, state.streaming_response, state}
end
defp broadcast_ui(name, msg), do: Phoenix.PubSub.broadcast(ElixirAi.PubSub, topic(name), msg)
defp broadcast_ui(name, msg), do: Phoenix.PubSub.broadcast(ElixirAi.PubSub, chat_topic(name), msg)
defp store_message(name, messages) when is_list(messages) do
Enum.each(messages, &store_message(name, &1))
@@ -319,7 +318,7 @@ defmodule ElixirAi.ChatRunner do
defp store_message(name, message) do
Phoenix.PubSub.broadcast(
ElixirAi.PubSub,
message_topic(name),
conversation_message_topic(name),
{:store_message, name, message}
)

View File

@@ -1,6 +1,7 @@
defmodule ElixirAi.ConversationManager do
use GenServer
alias ElixirAi.{Conversation, Message}
import ElixirAi.PubsubTopics, only: [conversation_message_topic: 1]
require Logger
@name {:via, Horde.Registry, {ElixirAi.ChatRegistry, __MODULE__}}
@@ -117,7 +118,7 @@ defmodule ElixirAi.ConversationManager do
def handle_info({:store_message, name, message}, %{conversations: conversations} = state) do
case Conversation.find_id(name) do
{:ok, conv_id} ->
Message.insert(conv_id, message, topic: ElixirAi.ChatRunner.message_topic(name))
Message.insert(conv_id, message, topic: conversation_message_topic(name))
_ ->
:ok
@@ -164,7 +165,7 @@ defmodule ElixirAi.ConversationManager do
if MapSet.member?(subscriptions, name) do
subscriptions
else
Phoenix.PubSub.subscribe(ElixirAi.PubSub, ElixirAi.ChatRunner.message_topic(name))
Phoenix.PubSub.subscribe(ElixirAi.PubSub, conversation_message_topic(name))
MapSet.put(subscriptions, name)
end

View File

@@ -1,6 +1,7 @@
defmodule ElixirAi.AiProvider do
alias ElixirAi.Data.DbHelpers
require Logger
import ElixirAi.PubsubTopics
defmodule AiProviderSchema do
defstruct [:id, :name, :model_name, :api_token, :completions_url]
@@ -77,14 +78,14 @@ defmodule ElixirAi.AiProvider do
"updated_at" => now
}
case DbHelpers.run_sql(sql, params, "ai_providers") do
case DbHelpers.run_sql(sql, params, providers_topic()) do
{:error, :db_error} ->
{:error, :db_error}
_result ->
Phoenix.PubSub.broadcast(
ElixirAi.PubSub,
"ai_providers",
providers_topic(),
{:provider_added, attrs}
)
@@ -102,7 +103,7 @@ defmodule ElixirAi.AiProvider do
params = %{"name" => name}
case DbHelpers.run_sql(sql, params, "ai_providers", AiProviderSchema.schema()) do
case DbHelpers.run_sql(sql, params, providers_topic(), AiProviderSchema.schema()) do
{:error, _} -> {:error, :db_error}
[] -> {:error, :not_found}
[row | _] -> {:ok, row |> convert_uuid_to_string() |> then(&struct(AiProviderSchema, &1))}
@@ -113,7 +114,7 @@ defmodule ElixirAi.AiProvider do
sql = "SELECT COUNT(*) FROM ai_providers"
params = %{}
case DbHelpers.run_sql(sql, params, "ai_providers") do
case DbHelpers.run_sql(sql, params, providers_topic()) do
{:error, :db_error} ->
{:error, :db_error}

View File

@@ -0,0 +1,6 @@
defmodule ElixirAi.PubsubTopics do
def conversation_message_topic(name), do: "conversation_messages:#{name}"
def chat_topic(name), do: "ai_chat:#{name}"
def providers_topic, do: "providers"
end