defmodule Ash.Api.Dsl do
@api %Spark.Dsl.Section{
name: :api,
describe: "General Api configuration",
examples: [
"""
api do
description \"\"\"
Resources related to the flux capacitor.
\"\"\"
end
"""
],
schema: [
description: [
type: :string,
doc: """
A description for the api.
"""
]
]
}
@execution %Spark.Dsl.Section{
name: :execution,
describe: "Options for how requests are executed using this Api",
examples: [
"""
execution do
timeout :timer.seconds(30)
end
"""
],
schema: [
timeout: [
type: :timeout,
doc: """
The default timeout to use for requests using this API. See the [timeouts guide](/documentation/topics/timeouts.md) for more.
""",
default: 30_000
],
trace_name: [
type: :string,
doc: """
The name to use in traces. Defaults to the last part of the module. See the [monitoring guide](/documentation/topics/monitoring.md) for more
"""
]
]
}
@authorization %Spark.Dsl.Section{
name: :authorization,
describe: """
Options for how requests are authorized using this Api. See the [security guide](/documentation/topics/security.md) for more.
""",
examples: [
"""
authorization do
authorize :by_default
end
"""
],
schema: [
require_actor?: [
type: :boolean,
default: false,
doc: "Requires that an actor has been supplied."
],
authorize: [
type: {:in, [:always, :by_default, :when_requested]},
default: :when_requested,
doc: """
When to run authorization for a given request.
"""
]
]
}
defmodule ResourceReference do
@moduledoc "A resource reference in an api"
defstruct [:resource]
end
@resource %Spark.Dsl.Entity{
name: :resource,
describe: "A resource present in the API",
examples: [
"resource Foo"
],
target: ResourceReference,
args: [:resource],
no_depend_modules: [:resource],
schema: [
resource: [
type: {:spark, Ash.Resource},
required: true
]
]
}
@resources %Spark.Dsl.Section{
name: :resources,
describe: "List the resources present in this API",
examples: [
"""
resources do
resource MyApp.Tweet
resource MyApp.Comment
end
"""
],
entities: [
@resource
],
schema: [
allow: [
type: :mfa,
doc: """
Support a dynamic resource list by providing a callback that checks whether or not the resource should be allowed.
"""
],
allow_unregistered?: [
type: :boolean,
default: false,
doc: """
Whether the Api will support only registered entries or not.
"""
],
registry: [
type: {:behaviour, Ash.Registry},
doc: """
Configure a registry that contains the resources. This option is generally not necessary anymore, and remains for backwards compatibility. Instead, configure resources in this block directly.
"""
]
],
no_depend_modules: [:registry]
}
@sections [@api, @resources, @execution, @authorization]
@moduledoc """
Apis are the entrypoints for working with your resources.
Apis may optionally include a list of resources, in which case they can be
used as an `Ash.Registry` in various places. This is for backwards compatibility,
but if at all possible you should define an `Ash.Registry` if you are using an extension
that requires a list of resources. For example, most extensions look for two application
environment variables called `:ash_apis` and `:ash_registries` to find any potential registries
"""
use Spark.Dsl.Extension, sections: @sections
end