lib/ash/resource/transformers/validate_multitenancy.ex

defmodule Ash.Resource.Transformers.ValidateMultitenancy do
  @moduledoc """
  Ensures that the multitenancy configuration is valid for the given resource
  """
  use Spark.Dsl.Transformer

  alias Spark.Dsl.Transformer

  def after_compile?, do: true

  # sobelow_skip ["DOS.BinToAtom"]
  def transform(dsl_state) do
    strategy = Transformer.get_option(dsl_state, [:multitenancy], :strategy)
    attribute = Transformer.get_option(dsl_state, [:multitenancy], :attribute)
    attributes = Transformer.get_entities(dsl_state, [:attributes])
    resource = Transformer.get_persisted(dsl_state, :module)
    data_layer = Transformer.get_persisted(dsl_state, :data_layer)

    cond do
      strategy == :context && not data_layer.can?(resource, :multitenancy) ->
        {:error,
         Spark.Error.DslError.exception(
           path: [:multitenancy, :strategy],
           message: "Data layer does not support multitenancy"
         )}

      strategy == :attribute && !Enum.any?(attributes, &(&1.name == attribute)) ->
        {:error,
         Spark.Error.DslError.exception(
           path: [:multitenancy, :attribute],
           message: "Attribute #{attribute} used in multitenancy configuration does not exist"
         )}

      true ->
        {:ok, dsl_state}
    end
  end
end