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