refactor(portal): move policy events to WAL (#9521)

Moves all of the policy lifecycle events to be broadcasted from the WAL
consumer.

#### Test

- [x] Enable policy
- [x] Disable policy
- [x] Delete policy
- [x] Non-breaking change
- [x] Breaking change


Related: #6294

---------

Signed-off-by: Jamil <jamilbk@users.noreply.github.com>
This commit is contained in:
Jamil
2025-06-13 18:10:09 -07:00
committed by GitHub
parent 817eeff19f
commit cbe33cd108
27 changed files with 660 additions and 681 deletions

View File

@@ -219,9 +219,8 @@ defmodule Web.Policies.Edit do
|> maybe_drop_unsupported_conditions(socket)
case Policies.update_policy(socket.assigns.policy, params, socket.assigns.subject) do
{:updated, updated_policy} ->
{:noreply,
push_navigate(socket, to: ~p"/#{socket.assigns.account}/policies/#{updated_policy}")}
{:ok, policy} ->
{:noreply, push_navigate(socket, to: ~p"/#{socket.assigns.account}/policies/#{policy}")}
{:error, changeset} ->
{:noreply, assign(socket, form: to_form(changeset))}

View File

@@ -1,10 +1,10 @@
defmodule Web.Policies.Index do
use Web, :live_view
alias Domain.Policies
alias Domain.{Events, Policies}
def mount(_params, _session, socket) do
if connected?(socket) do
:ok = Policies.subscribe_to_events_for_account(socket.assigns.account)
:ok = Events.Hooks.Accounts.subscribe_to_policies(socket.assigns.account.id)
end
socket =

View File

@@ -1,7 +1,7 @@
defmodule Web.Policies.Show do
use Web, :live_view
import Web.Policies.Components
alias Domain.{Accounts, Policies, Flows, Auth}
alias Domain.{Accounts, Policies, Events, Flows, Auth}
def mount(%{"id" => id}, _session, socket) do
with {:ok, policy} <-
@@ -16,7 +16,7 @@ defmodule Web.Policies.Show do
providers = Auth.all_active_providers_for_account!(socket.assigns.account)
if connected?(socket) do
:ok = Policies.subscribe_to_events_for_policy(policy)
:ok = Events.Hooks.Policies.subscribe(policy.id)
end
socket =

View File

@@ -1,5 +1,6 @@
defmodule Web.Live.Policies.IndexTest do
use Web.ConnCase, async: true
alias Domain.Events
setup do
account = Fixtures.Accounts.create_account()
@@ -92,7 +93,14 @@ defmodule Web.Live.Policies.IndexTest do
refute html =~ "The table data has changed."
refute html =~ "reload-btn"
Fixtures.Policies.create_policy(account: account, description: "foo bar")
policy = Fixtures.Policies.create_policy(account: account, description: "foo bar")
Events.Hooks.Policies.on_insert(%{
"id" => policy.id,
"actor_group_id" => policy.actor_group_id,
"resource_id" => policy.resource_id,
"account_id" => account.id
})
reload_btn =
lv
@@ -120,6 +128,17 @@ defmodule Web.Live.Policies.IndexTest do
Domain.Policies.delete_policy(policy, subject)
Events.Hooks.Policies.on_delete(%{
"id" => policy.id,
"actor_group_id" => policy.actor_group_id,
"resource_id" => policy.resource_id,
"account_id" => account.id
})
# TODO: WAL
# Remove this after direct broadcast
Process.sleep(100)
reload_btn =
lv
|> element("#policies-reload-btn")