Update email sync loader and changes to use system actor instead of user actor. This ensures email sync always works regardless of user permissions.
66 lines
2 KiB
Elixir
66 lines
2 KiB
Elixir
defmodule Mv.EmailSync.Loader do
|
|
@moduledoc """
|
|
Helper functions for loading linked records in email synchronization.
|
|
Centralizes the logic for retrieving related User/Member entities.
|
|
|
|
## Authorization
|
|
|
|
This module runs systemically and uses the system actor for all operations.
|
|
This ensures that email synchronization always works, regardless of user permissions.
|
|
|
|
All functions use `Mv.Helpers.SystemActor.get_system_actor/0` to bypass
|
|
user permission checks, as email sync is a mandatory side effect.
|
|
"""
|
|
alias Mv.Helpers
|
|
alias Mv.Helpers.SystemActor
|
|
|
|
@doc """
|
|
Loads the member linked to a user, returns nil if not linked or on error.
|
|
|
|
Uses system actor for authorization to ensure email sync always works.
|
|
"""
|
|
def get_linked_member(user)
|
|
def get_linked_member(%{member_id: nil}), do: nil
|
|
|
|
def get_linked_member(%{member_id: id}) do
|
|
system_actor = SystemActor.get_system_actor()
|
|
opts = Helpers.ash_actor_opts(system_actor)
|
|
|
|
case Ash.get(Mv.Membership.Member, id, opts) do
|
|
{:ok, member} -> member
|
|
{:error, _} -> nil
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Loads the user linked to a member, returns nil if not linked or on error.
|
|
|
|
Uses system actor for authorization to ensure email sync always works.
|
|
"""
|
|
def get_linked_user(member) do
|
|
system_actor = SystemActor.get_system_actor()
|
|
opts = Helpers.ash_actor_opts(system_actor)
|
|
|
|
case Ash.load(member, :user, opts) do
|
|
{:ok, %{user: user}} -> user
|
|
{:error, _} -> nil
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Loads the user linked to a member, returning an error tuple if not linked.
|
|
Useful when a link is required for the operation.
|
|
|
|
Uses system actor for authorization to ensure email sync always works.
|
|
"""
|
|
def load_linked_user!(member) do
|
|
system_actor = SystemActor.get_system_actor()
|
|
opts = Helpers.ash_actor_opts(system_actor)
|
|
|
|
case Ash.load(member, :user, opts) do
|
|
{:ok, %{user: user}} when not is_nil(user) -> {:ok, user}
|
|
{:ok, _} -> {:error, :no_linked_user}
|
|
{:error, _} = error -> error
|
|
end
|
|
end
|
|
end
|