mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 21:43:02 +12:00
3b803d4c55
improvement: simplify filter statements further improvement: don't overconstraint filters on related data test: get started on some more complex policy tests
46 lines
1.3 KiB
Elixir
46 lines
1.3 KiB
Elixir
defmodule Ash.Test.Support.PolicyComplex.User.Relationships.Friends do
|
|
@moduledoc false
|
|
use Ash.Resource.ManualRelationship
|
|
require Ash.Query
|
|
|
|
def load(users, _, %{api: api, query: query}) do
|
|
user_ids = Enum.map(users, & &1.id)
|
|
|
|
friend_links =
|
|
Ash.Test.Support.PolicyComplex.FriendLink
|
|
|> Ash.Query.filter(source_id in ^user_ids or destination_id in ^user_ids)
|
|
|> api.read!()
|
|
|
|
all_relevant_user_ids =
|
|
friend_links
|
|
|> Enum.flat_map(fn %{source_id: source_id, destination_id: destination_id} ->
|
|
[source_id, destination_id]
|
|
end)
|
|
|> Enum.uniq()
|
|
|
|
all_relevant_users =
|
|
query
|
|
|> Ash.Query.filter(id in ^all_relevant_user_ids)
|
|
|> api.read!()
|
|
|> Map.new(&{&1.id, &1})
|
|
|
|
{:ok,
|
|
Map.new(users, fn user ->
|
|
friends =
|
|
friend_links
|
|
|> Enum.filter(fn %{source_id: source_id, destination_id: destination_id} ->
|
|
source_id == user.id || destination_id == user.id
|
|
end)
|
|
|> Enum.map(fn %{source_id: source_id, destination_id: destination_id} ->
|
|
if source_id == user.id do
|
|
Map.get(all_relevant_users, destination_id)
|
|
else
|
|
Map.get(all_relevant_users, source_id)
|
|
end
|
|
end)
|
|
|> Enum.uniq()
|
|
|
|
{user.id, friends}
|
|
end)}
|
|
end
|
|
end
|