-
-
Notifications
You must be signed in to change notification settings - Fork 208
/
has_destination_field.ex
42 lines (36 loc) · 1.16 KB
/
has_destination_field.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
defmodule Ash.Resource.Transformers.HasDestinationField do
@moduledoc "Guesses the `destination_attribute` for has many and has one relationships unless provided"
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
def transform(dsl_state) do
new_dsl_state =
dsl_state
|> Transformer.get_entities([:relationships])
|> Enum.reduce(dsl_state, fn
%{type: type, destination_attribute: nil} = relationship, dsl_state
when type in [:has_many, :has_one] ->
new_relationship = %{relationship | destination_attribute: resource_id_field(dsl_state)}
Transformer.replace_entity(
dsl_state,
[:relationships],
new_relationship,
fn replacing ->
replacing.name == relationship.name
end
)
_relationship, dsl_state ->
dsl_state
end)
{:ok, new_dsl_state}
end
# sobelow_skip ["DOS.StringToAtom"]
defp resource_id_field(dsl_state) do
dsl_state
|> Transformer.get_persisted(:module)
|> Module.split()
|> List.last()
|> Macro.underscore()
|> Kernel.<>("_id")
|> String.to_atom()
end
end