defmodule AshPaperTrail.Resource.Transformers.RelateVersionResource do
@moduledoc "Relates the resource to its created version resource"
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
# sobelow_skip ["DOS.StringToAtom"]
def transform(dsl_state) do
with {:ok, source_attribute} <- validate_source_attribute(dsl_state),
{:ok, relationship} <- build_has_many(dsl_state, source_attribute) do
{:ok,
Transformer.add_entity(dsl_state, [:relationships], %{
relationship
| source: Transformer.get_persisted(dsl_state, :module)
})}
end
end
def before?(Ash.Resource.Transformers.SetRelationshipSource), do: true
def before?(_), do: false
def after?(_), do: true
defp validate_source_attribute(dsl_state) do
case Ash.Resource.Info.primary_key(dsl_state) do
[key] ->
{:ok, key}
keys ->
{:error,
"Only resources with a single primary key are currently supported. Got keys #{inspect(keys)}"}
end
end
defp build_has_many(dsl_state, source_attribute) do
default_opts = [
name: :paper_trail_versions,
destination: AshPaperTrail.Resource.Info.version_resource(dsl_state),
destination_attribute: :version_source_id,
source_attribute: source_attribute
]
opts =
default_opts
|> Keyword.merge(AshPaperTrail.Resource.Info.relationship_opts(dsl_state))
Transformer.build_entity(
Ash.Resource.Dsl,
[:relationships],
:has_many,
opts
)
end
end