cheatsheets/absinthe.md

159 lines
2.6 KiB
Markdown

---
title: Absinthe
category: Hidden
tags: [WIP]
updated: 2017-10-10
intro: |
[Absinthe](http://absinthe-graphql.org/) allows you to write GraphQL servers in Elixir.
---
## Introduction
### Concepts
- `Schema` - The root. Defines what queries you can do, and what types they return.
- `Resolver` - Functions that return data.
- `Type` - A type definition describing the shape of the data you'll return.
### Plug
#### web/router.ex
```elixir
defmodule Blog.Web.Router do
use Phoenix.Router
forward "/", Absinthe.Plug,
schema: Blog.Schema
end
```
{: data-line="4,5"}
Absinthe is a Plug, and you pass it one **Schema**.
See: [Our first query](http://absinthe-graphql.org/tutorial/our-first-query/)
## Main concepts
{: .-three-column}
### Schema
#### web/schema.ex
```elixir
defmodule Blog.Schema do
use Absinthe.Schema
import_types Blog.Schema.Types
query do
@desc "Get a list of blog posts"
field :posts, list_of(:post) do
resolve &Blog.PostResolver.all/2
end
end
end
```
{: data-line="5,6,7,8,9,10"}
This schema will account for `{ posts { ··· } }`. It returns a **Type** of `:post`, and delegates to a **Resolver**.
### Resolver
#### web/resolvers/post_resolver.ex
```elixir
defmodule Blog.PostResolver do
def all(_args, _info) do
{:ok, Blog.Repo.all(Blog.Post)}
end
end
```
{: data-line="3"}
This is the function that the schema delegated the `posts` query to.
### Type
#### web/schema/types.ex
```elixir
defmodule Blog.Schema.Types do
use Absinthe.Schema.Notation
@desc "A blog post"
object :post do
field :id, :id
field :title, :string
field :body, :string
end
end
```
{: data-line="4,5,6,7,8,9"}
This defines a type `:post`, which is used by the resolver.
## Schema
### Query arguments
#### GraphQL query
```
{ user(id: "1") { ··· } }
```
#### web/schema.ex
```elixir
query do
field :user, type: :user do
arg :id, non_null(:id)
resolve &Blog.UserResolver.find/2
end
end
```
{: data-line="3"}
#### Resolver
```elixir
def find(%{id: id} = args, _info) do
···
end
```
{: data-line="1"}
See: [Query arguments](http://absinthe-graphql.org/tutorial/query-arguments/)
### Mutations
#### GraphQL query
```
{
mutation CreatePost {
post(title: "Hello") { id }
}
}
```
#### web/schema.ex
```elixir
mutation do
@desc "Create a post"
field :post, type: :post do
arg :title, non_null(:string)
resolve &Blog.PostResolver.create/2
end
end
```
{: data-line="1"}
See: [Mutations](http://absinthe-graphql.org/tutorial/mutations/)
## References
- [Absinthe website](http://absinthe-graphql.org/) _(absinthe-graphql.org)_
- [GraphQL cheatsheet](./graphql) _(devhints.io)_