-
-
Notifications
You must be signed in to change notification settings - Fork 181
/
cache_relationships.ex
44 lines (36 loc) · 1.07 KB
/
cache_relationships.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
defmodule Ash.Resource.Transformers.CacheRelationships do
@moduledoc """
Persists commonly used relationship information.
"""
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
def after?(_), do: true
def transform(dsl_state) do
relationships =
Ash.Resource.Info.relationships(dsl_state)
relationships_by_name =
relationships
|> Enum.reduce(%{}, fn %{name: name} = attr, acc ->
acc
|> Map.put(name, attr)
|> Map.put(to_string(name), attr)
end)
relationship_names = Enum.map(relationships, & &1.name)
required_belongs_to_relationships =
Enum.filter(relationships, &(&1.type == :belongs_to && !&1.allow_nil?))
{:ok,
persist(
dsl_state,
%{
relationship_names: relationship_names,
relationships_by_name: relationships_by_name,
required_belongs_to_relationships: required_belongs_to_relationships
}
)}
end
defp persist(dsl, map) do
Enum.reduce(map, dsl, fn {key, value}, dsl ->
Transformer.persist(dsl, key, value)
end)
end
end