From absinthe-graphql
Guides designing GraphQL schemas with Absinthe in Elixir. Covers type definitions, interfaces, unions, enums, input objects, schema organization, custom scalars, and best practices.
npx claudepluginhub thebushidocollective/han --plugin absinthe-graphqlThis skill uses the workspace's default tool permissions.
Comprehensive guide to designing GraphQL schemas with Absinthe in Elixir.
Guides GraphQL schema design with best practices for types, nullability, pagination, error patterns, and security. Use when designing new schemas, reviewing existing ones, or deciding on type structures.
Designs GraphQL schemas with type system, SDL patterns, field design, pagination, directives, and versioning for scalable APIs.
Designs and implements GraphQL APIs with schema design, resolvers, queries, mutations, subscriptions, and best practices. Covers Node.js Apollo Server and Python Graphene for servers, schema design, or REST migration.
Share bugs, ideas, or general feedback.
Comprehensive guide to designing GraphQL schemas with Absinthe in Elixir.
defmodule MyApp.Schema.Types do
use Absinthe.Schema.Notation
object :user do
field :id, non_null(:id)
field :name, non_null(:string)
field :email, :string
field :posts, list_of(:post) do
resolve &MyApp.Resolvers.User.posts/3
end
field :inserted_at, :datetime
end
object :post do
field :id, non_null(:id)
field :title, non_null(:string)
field :body, :string
field :author, :user do
resolve &MyApp.Resolvers.Post.author/3
end
end
end
interface :node do
field :id, non_null(:id)
resolve_type fn
%MyApp.User{}, _ -> :user
%MyApp.Post{}, _ -> :post
_, _ -> nil
end
end
object :user do
interface :node
field :id, non_null(:id)
field :name, non_null(:string)
end
union :search_result do
types [:user, :post, :comment]
resolve_type fn
%MyApp.User{}, _ -> :user
%MyApp.Post{}, _ -> :post
%MyApp.Comment{}, _ -> :comment
_, _ -> nil
end
end
enum :post_status do
value :draft, as: "draft"
value :published, as: "published"
value :archived, as: "archived"
end
input_object :create_post_input do
field :title, non_null(:string)
field :body, :string
field :status, :post_status, default_value: :draft
end
defmodule MyApp.Schema do
use Absinthe.Schema
import_types MyApp.Schema.Types
import_types MyApp.Schema.Queries
import_types MyApp.Schema.Mutations
import_types MyApp.Schema.Subscriptions
import_types Absinthe.Type.Custom # DateTime, etc.
query do
import_fields :user_queries
import_fields :post_queries
end
mutation do
import_fields :user_mutations
import_fields :post_mutations
end
subscription do
import_fields :post_subscriptions
end
end
scalar :uuid, name: "UUID" do
serialize &to_string/1
parse &parse_uuid/1
end
defp parse_uuid(%Absinthe.Blueprint.Input.String{value: value}) do
case Ecto.UUID.cast(value) do
{:ok, uuid} -> {:ok, uuid}
:error -> :error
end
end
defp parse_uuid(_), do: :error