Packages

The extension for building GraphQL APIs with Ash

Current section

Files

Jump to
ash_graphql lib resource verifiers verify_subscription_actions.ex
Raw

lib/resource/verifiers/verify_subscription_actions.ex

defmodule AshGraphql.Resource.Verifiers.VerifySubscriptionActions do
# Validates the paginate_relationship_with option
@moduledoc false
use Spark.Dsl.Verifier
alias Spark.Dsl.Transformer
def verify(dsl) do
dsl
|> AshGraphql.Resource.Info.subscriptions(Ash.Resource.Info.domain(dsl))
|> Enum.each(&verify_actions(dsl, &1))
:ok
end
defp verify_actions(dsl, subscription) do
unless MapSet.subset?(
MapSet.new(List.wrap(subscription.action_types)),
MapSet.new([:create, :update, :destroy])
) do
raise Spark.Error.DslError,
module: Transformer.get_persisted(dsl, :module),
message: "`action_types` values must be on of `[:create, :update, :destroy]`.",
path: [:graphql, :subscriptions, subscription.name, :action_types]
end
missing_write_actions =
MapSet.difference(
MapSet.new(List.wrap(subscription.actions)),
MapSet.new(
Ash.Resource.Info.actions(dsl)
|> Stream.filter(&(&1.type in [:create, :update, :destroy]))
|> Enum.map(& &1.name)
)
)
unless Enum.empty?(missing_write_actions) do
raise Spark.Error.DslError,
module: Transformer.get_persisted(dsl, :module),
message:
"The actions #{Enum.join(missing_write_actions, ", ")} do not exist on the resource.",
path: [:graphql, :subscriptions, subscription.name, :actions]
end
unless is_nil(subscription.read_action) or
subscription.read_action in (Ash.Resource.Info.actions(dsl)
|> Stream.filter(&(&1.type == :read))
|> Enum.map(& &1.name)) do
raise Spark.Error.DslError,
module: Transformer.get_persisted(dsl, :module),
message: "The read action #{subscription.read_action} does not exist on the resource.",
path: [:graphql, :subscriptions, subscription.name, :read_action]
end
end
end