This commit is contained in:
parent
104d945dd1
commit
cc1df449c6
9 changed files with 253 additions and 161 deletions
56
lib/mv/membership/custom_field_lookup.ex
Normal file
56
lib/mv/membership/custom_field_lookup.ex
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
defmodule Mv.Membership.CustomFieldLookup do
|
||||
@moduledoc """
|
||||
Shared helper for loading custom fields by ID.
|
||||
"""
|
||||
|
||||
alias Mv.Constants
|
||||
alias Mv.Membership
|
||||
|
||||
@spec fetch_map_by_ids([String.t()], keyword()) :: map()
|
||||
def fetch_map_by_ids(field_ids, opts \\ []) when is_list(field_ids) do
|
||||
member_field_strings = Constants.member_fields() |> Enum.map(&Atom.to_string/1)
|
||||
|
||||
custom_field_ids =
|
||||
field_ids
|
||||
|> Enum.uniq()
|
||||
|> Enum.reject(&(&1 in member_field_strings))
|
||||
|
||||
if custom_field_ids == [] do
|
||||
%{}
|
||||
else
|
||||
select = Keyword.get(opts, :select, [:id, :name, :value_type])
|
||||
|
||||
query =
|
||||
Membership.CustomField
|
||||
|> Ash.Query.select(select)
|
||||
|
||||
read_opts =
|
||||
[domain: Membership]
|
||||
|> maybe_put_actor(opts)
|
||||
|> maybe_put_authorize(opts)
|
||||
|
||||
case Ash.read(query, read_opts) do
|
||||
{:ok, fields} ->
|
||||
allowed_ids = MapSet.new(custom_field_ids)
|
||||
fields |> Enum.filter(&MapSet.member?(allowed_ids, &1.id)) |> Map.new(&{&1.id, &1})
|
||||
|
||||
{:error, _} ->
|
||||
%{}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp maybe_put_actor(opts, read_opts) do
|
||||
case Keyword.fetch(read_opts, :actor) do
|
||||
{:ok, actor} -> Keyword.put(opts, :actor, actor)
|
||||
:error -> opts
|
||||
end
|
||||
end
|
||||
|
||||
defp maybe_put_authorize(opts, read_opts) do
|
||||
case Keyword.fetch(read_opts, :authorize?) do
|
||||
{:ok, authorize?} -> Keyword.put(opts, :authorize?, authorize?)
|
||||
:error -> opts
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue