From 94815605b93d3177716015771b126c6d24bb4a3b Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 13 Jul 2023 08:42:52 -0400 Subject: [PATCH] improvement: warn on api missing from config --- config/config.exs | 1 + lib/ash/api/api.ex | 39 +++++++++++++++++++++++++++++++++++++- lib/ash/embeddable_type.ex | 2 +- lib/ash/filter/filter.ex | 2 +- lib/ash/resource.ex | 6 ++++++ 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/config/config.exs b/config/config.exs index a218a759..96e596dd 100644 --- a/config/config.exs +++ b/config/config.exs @@ -28,4 +28,5 @@ if Mix.env() == :test do ] config :ash, :validate_api_resource_inclusion?, false + config :ash, :validate_api_config_inclusion?, false end diff --git a/lib/ash/api/api.ex b/lib/ash/api/api.ex index 4e70c3d2..b4b94e03 100644 --- a/lib/ash/api/api.ex +++ b/lib/ash/api/api.ex @@ -36,7 +36,14 @@ defmodule Ash.Api do Additionally, you can define a `code_interface` on each resource. See the code interface guide for more. """ - use Spark.Dsl, default_extensions: [extensions: [Ash.Api.Dsl]] + use Spark.Dsl, + default_extensions: [extensions: [Ash.Api.Dsl]], + opt_schema: [ + validate_config_inclusion?: [ + type: :boolean, + default: true + ] + ] import Spark.OptionsHelpers, only: [merge_schemas: 3] @@ -1398,6 +1405,36 @@ defmodule Ash.Api do end end + @impl true + def verify(module, opts) do + if Application.get_env(:ash, :validate_api_config_inclusion?, true) && + Keyword.get(opts, :validate_config_inclusion?, true) do + otp_app = Mix.Project.config()[:app] + + apis = + Application.get_env(otp_app, :ash_apis, []) + + if module not in apis do + IO.warn(""" + Api #{inspect(module)} is not present in + + config :#{otp_app}, ash_apis: #{inspect(apis)}. + + + To resolve this warning, do one of the following. + + 1. Add the api to your configured api modules. The following snippet can be used. + + config :#{otp_app}, ash_apis: #{inspect(apis ++ [module])} + + 2. Add the option `validate_config_inclusion?: false` to `use Ash.Api` + + 3. Configure all apis not to warn, with `config :ash, :validate_api_config_inclusion?, false` + """) + end + end + end + @doc false # sobelow_skip ["DOS.StringToAtom"] @impl Spark.Dsl diff --git a/lib/ash/embeddable_type.ex b/lib/ash/embeddable_type.ex index 6b860db4..e9d6be47 100644 --- a/lib/ash/embeddable_type.ex +++ b/lib/ash/embeddable_type.ex @@ -61,7 +61,7 @@ defmodule Ash.EmbeddableType do defmodule ShadowApi do @moduledoc false - use Ash.Api + use Ash.Api, validate_config_inclusion?: false resources do allow_unregistered?(true) diff --git a/lib/ash/filter/filter.ex b/lib/ash/filter/filter.ex index 32a9c595..7c8ff1ad 100644 --- a/lib/ash/filter/filter.ex +++ b/lib/ash/filter/filter.ex @@ -192,7 +192,7 @@ defmodule Ash.Filter do # Used for fetching related data in filters, which will have already had authorization rules applied defmodule ShadowApi do @moduledoc false - use Ash.Api + use Ash.Api, validate_config_inclusion?: false resources do allow_unregistered?(true) diff --git a/lib/ash/resource.ex b/lib/ash/resource.ex index 63caac89..7cdbf3fa 100644 --- a/lib/ash/resource.ex +++ b/lib/ash/resource.ex @@ -17,6 +17,12 @@ defmodule Ash.Resource do default_extensions: [ data_layer: Ash.DataLayer.Simple, extensions: [Ash.Resource.Dsl] + ], + opt_schema: [ + validate_api_inclusion?: [ + type: :boolean, + default: true + ] ] @doc false