Packages

phoenix_kit

1.7.34
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib modules entities events.ex
Raw

lib/modules/entities/events.ex

defmodule PhoenixKit.Modules.Entities.Events do
@moduledoc """
PubSub helpers for coordinating real-time entity updates.
Provides broadcast and subscribe helpers for:
* Entity definition lifecycle (create/update/delete)
* Entity data lifecycle (create/update/delete)
* Collaborative editing signals for entity + data forms
All events are broadcast through `PhoenixKit.PubSub.Manager` so the library
remains self-contained when embedded into host applications.
"""
alias PhoenixKit.PubSub.Manager
# Base topics
@topic_entities "phoenix_kit:entities:definitions"
@topic_data "phoenix_kit:entities:data"
@topic_entity_forms "phoenix_kit:entities:entity_forms"
@topic_data_forms "phoenix_kit:entities:data_forms"
## Subscription helpers
@doc "Subscribe to entity definition lifecycle events."
def subscribe_to_entities, do: Manager.subscribe(@topic_entities)
@doc "Subscribe to entity data lifecycle events (all entities)."
def subscribe_to_all_data, do: Manager.subscribe(@topic_data)
@doc "Subscribe to data lifecycle events for a specific entity."
def subscribe_to_entity_data(entity_id), do: Manager.subscribe(data_topic(entity_id))
@doc "Subscribe to collaborative events for a specific entity form."
def subscribe_to_entity_form(form_key),
do: Manager.subscribe(entity_form_topic(form_key))
@doc "Subscribe to collaborative events for a specific data record form."
def subscribe_to_data_form(entity_id, record_key),
do: Manager.subscribe(data_form_topic(entity_id, record_key))
@doc "Subscribe to presence updates for an entity."
def subscribe_to_entity_presence(entity_id),
do: Manager.subscribe(entity_presence_topic(entity_id))
@doc "Subscribe to presence updates for a data record."
def subscribe_to_data_presence(entity_id, data_id),
do: Manager.subscribe(data_presence_topic(entity_id, data_id))
## Entity definition lifecycle
def broadcast_entity_created(entity_id),
do: broadcast(@topic_entities, {:entity_created, entity_id})
def broadcast_entity_updated(entity_id),
do: broadcast(@topic_entities, {:entity_updated, entity_id})
def broadcast_entity_deleted(entity_id),
do: broadcast(@topic_entities, {:entity_deleted, entity_id})
## Entity data lifecycle
def broadcast_data_created(entity_id, data_id) do
message = {:data_created, entity_id, data_id}
broadcast(@topic_data, message)
broadcast(data_topic(entity_id), message)
end
def broadcast_data_updated(entity_id, data_id) do
message = {:data_updated, entity_id, data_id}
broadcast(@topic_data, message)
broadcast(data_topic(entity_id), message)
end
def broadcast_data_deleted(entity_id, data_id) do
message = {:data_deleted, entity_id, data_id}
broadcast(@topic_data, message)
broadcast(data_topic(entity_id), message)
end
## Collaborative form editing
def broadcast_entity_form_change(form_key, payload, opts \\ []) do
broadcast(
entity_form_topic(form_key),
{:entity_form_change, form_key, payload, Keyword.get(opts, :source)}
)
end
def broadcast_data_form_change(entity_id, record_key, payload, opts \\ []) do
broadcast(
data_form_topic(entity_id, record_key),
{:data_form_change, entity_id, normalize_record_key(record_key), payload,
Keyword.get(opts, :source)}
)
end
## State synchronization for new joiners
def broadcast_entity_form_sync_request(form_key, requester_socket_id) do
broadcast(
entity_form_topic(form_key),
{:entity_form_sync_request, form_key, requester_socket_id}
)
end
def broadcast_entity_form_sync_response(form_key, requester_socket_id, state) do
broadcast(
entity_form_topic(form_key),
{:entity_form_sync_response, form_key, requester_socket_id, state}
)
end
def broadcast_data_form_sync_request(entity_id, record_key, requester_socket_id) do
broadcast(
data_form_topic(entity_id, record_key),
{:data_form_sync_request, entity_id, normalize_record_key(record_key), requester_socket_id}
)
end
def broadcast_data_form_sync_response(entity_id, record_key, requester_socket_id, state) do
broadcast(
data_form_topic(entity_id, record_key),
{:data_form_sync_response, entity_id, normalize_record_key(record_key), requester_socket_id,
state}
)
end
## Topic helpers
defp data_topic(entity_id), do: "#{@topic_data}:#{entity_id}"
defp entity_form_topic(form_key), do: "#{@topic_entity_forms}:#{form_key}"
defp data_form_topic(entity_id, record_key),
do: "#{@topic_data_forms}:#{entity_id}:#{normalize_record_key(record_key)}"
defp entity_presence_topic(entity_id),
do: "phoenix_kit:entities:presence:entity:#{entity_id}"
defp data_presence_topic(entity_id, data_id),
do: "phoenix_kit:entities:presence:data:#{entity_id}:#{data_id}"
defp normalize_record_key({:new, slug}), do: "new-#{slug}"
defp normalize_record_key(record_key) when is_atom(record_key), do: Atom.to_string(record_key)
defp normalize_record_key(record_key) when is_integer(record_key),
do: Integer.to_string(record_key)
defp normalize_record_key(record_key), do: to_string(record_key)
defp broadcast(topic, payload), do: Manager.broadcast(topic, payload)
end