links: Phoenix MOC
Add Absinthe to Phoenix app
Installation
Add these plugins to the phoenix app
{:absinthe, "~> 1.6"},
{:absinthe_plug, "~> 1.5"}Schema
Each graphql query or mutation has two parts, schema and resolver.
Schema defines how the data is and resolver finds the data in backend and returns to frontend
Now create a schema directory in the web folder and a schema file so we can start writing schema
defmodule KancheWeb.Schema do
use Absinthe.Schema
query do
@desc "Get all users"
field :users, list_of(:user) do
resolve &KancheWeb.Resolvers.Accounts.users/3
end
end
object :user do
field :id, non_null(:id)
field :email, non_null(:string)
field :password_hash, non_null(:string)
end
endIn the above example, we instruct to use Absinthe.Schema and we have a query macro where we define the queries with description, field and resolve.
The object macro can be used to defined user object containing three fields
Resolver
Create a new resolver directory under web and then create a elixir file with context name Context.ex, in this example Accounts.ex
defmodule KancheWeb.Resolvers.Accounts do
alias Kanche.Accounts
def users(_, _, _) do
{:ok, Accounts.list_users()}
end
endResolvers are 3-arity functions. Most of the time you care about the second argument which is a map of query arguments. The resolver functions simply delegate the work to the generated Accounts context module and return an :ok tuple
The only thing left is to configure router.ex file
scope "/graphql" do
pipe_through :api
# Absinthe Graphql Routes
forward "/graphiql", Absinthe.Plug.GraphiQL,
schema: KancheWeb.Schema,
interface: :simple
forward "/", Absinthe.Plug,
schema: KancheWeb.Schema
endThat’s it 🥳
tags: graphql, phoenix, absinthe, basics sources:
- [https://pragmaticstudio.com/tutorials/how-to-setup-graphql-in-a-phoenix-app](How to setup graphql in a phoenix app)
- [https://www.howtographql.com/graphql-elixir/2-queries/](How to graphql)