| name | ash-graphql |
| description | Rules for working with AshGraphql |
Rules for working with AshGraphql
Understanding AshGraphql
AshGraphql is a package for integrating Ash Framework with GraphQL. It provides tools for generating GraphQL types, queries, mutations, and subscriptions from your Ash resources. AshGraphql leverages Absinthe under the hood to create a seamless integration between your Ash resources and GraphQL API.
Domain Configuration
AshGraphql works by extending your Ash domains and resources with GraphQL capabilities. First, add the AshGraphql extension to your domain.
Setting Up Your Domain
defmodule MyApp.Blog do
use Ash.Domain,
extensions: [
AshGraphql.Domain
]
graphql do
# Define GraphQL-specific settings for this domain
authorize? true
# Add GraphQL queries separate from the resource config
queries do
get Post, :get_post, :read
list Post, :list_posts, :read
end
# Add GraphQL mutations separate from the resource config
mutations do
create Post, :create_post, :create
update Post, :update_post, :update
destroy Post, :destroy_post, :destroy
end
# Add GraphQL subscriptions
subscriptions do
subscribe Post, :post_created do
action_types(:create)
end
end
end
resources do
resource MyApp.Blog.Post
resource MyApp.Blog.Comment
end
end
Creating Your GraphQL Schema
Create an Absinthe schema that uses your Ash domains:
defmodule MyApp.Schema do
use Absinthe.Schema
# List all domains that contain resources to expose via GraphQL
@domains [MyApp.Blog, MyApp.Accounts]
# Configure AshGraphql with your domains
use AshGraphql,
domains: @domains,
# Generate SDL file (optional)
generate_sdl_file: "schema.graphql"
end
Resource Configuration
Each resource that you want to expose via GraphQL needs to include the AshGraphql.Resource extension.
Setting Up Resources
defmodule MyApp.Blog.Post do
use Ash.Resource,
domain: MyApp.Blog,
extensions: [AshGraphql.Resource]
attributes do
uuid_primary_key :id
attribute :title, :string
attribute :body, :string
attribute :published, :boolean
attribute :view_count, :integer
end
relationships do
belongs_to :author, MyApp.Accounts.User
has_many :comments, MyApp.Blog.Comment
end
graphql do
# The GraphQL type name (required)
type :post
# Customize attribute types for GraphQL
attribute_types view_count: :string
# Configure managed relationships (for nested create/update)
managed_relationships do
managed_relationship :with_comments, :comments
end
end
actions do
defaults [:create, :read, :update, :destroy]
read :list_published do
filter expr(published == true)
end
update :publish do
accept []
change set_attribute(:published, true)
end
end
end
Custom Types
AshGraphql automatically handles conversion of Ash types to GraphQL types, but you can customize it:
defmodule MyApp.CustomType do
use Ash.Type
@impl true
def graphql_type(_), do: :string
@impl true
def graphql_input_type(_), do: :string
end