mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 21:43:02 +12:00
47 lines
1.3 KiB
Elixir
47 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
|