ash_postgres/lib/verifiers/validate_identity_index_names.ex
2024-06-25 08:25:17 -04:00

61 lines
2 KiB
Elixir

defmodule AshPostgres.Verifiers.ValidateIdentityIndexNames do
@moduledoc false
use Spark.Dsl.Verifier
alias Spark.Dsl.Verifier
def verify(dsl) do
identity_index_names =
AshPostgres.DataLayer.Info.identity_index_names(dsl)
Enum.each(identity_index_names, fn {identity, name} ->
if String.length(name) > 63 do
raise Spark.Error.DslError,
path: [:postgres, :identity_index_names, identity],
module: Verifier.get_persisted(dsl, :module),
message: """
Identity #{identity} has a name that is too long. Names must be 63 characters or less.
"""
end
end)
table = AshPostgres.DataLayer.Info.table(dsl)
if table do
dsl
|> Ash.Resource.Info.identities()
|> Enum.map(fn identity ->
{identity, identity_index_names[identity.name] || "#{table}_#{identity.name}_index"}
end)
|> Enum.group_by(&elem(&1, 1), &elem(&1, 0))
|> Enum.each(fn
{name, [_, _ | _] = identities} ->
raise Spark.Error.DslError,
path: [:postgres, :identity_index_names, name],
module: Verifier.get_persisted(dsl, :module),
message: """
Multiple identities would result in the same index name: #{name}
Identities: #{inspect(Enum.map(identities, & &1.name))}
"""
{name, [identity]} ->
if String.length(name) > 63 do
raise Spark.Error.DslError,
path: [:postgres, :identity_index_names, name],
module: Verifier.get_persisted(dsl, :module),
message: """
Identity #{identity.name} has a name that is too long. Names must be 63 characters or less.
Please configure an index name for this identity in the `identity_index_names` configuration. For example:
postgres do
identity_index_names #{inspect(identity.name)}: "a_shorter_name"
end
"""
end
end)
end
:ok
end
end