Skip to content
This repository has been archived by the owner on Jul 25, 2024. It is now read-only.

graphql-elixir/plug_graphql

Repository files navigation

GraphQL Plug

Build Status Public Slack Discussion

plug_graphql is a Plug integration for the GraphQL Elixir implementation of Facebook's GraphQL.

This Plug allows you to easily mount a GraphQL endpoint in Phoenix. This example project shows you how:

Installation

  1. Make a new Phoenix app, or add it to your existing app.
```sh
mix phoenix.new hello_graphql
cd hello_graphql
```

```sh
git clone https://github.com/graphql-elixir/hello_graphql_phoenix
```
  1. Add plug_graphql to your list of dependencies and applications in mix.exs and install the package with mix deps.get.
```elixir
def application do
  # Add the application to your list of applications.
  # This will ensure that it will be included in a release.
  [applications: [:logger, :plug_graphql]]
end

def deps do
  [{:plug_graphql, "~> 0.3.1"}]
end
```

Usage

  1. Define a simple schema in web/graphql/test_schema.ex:
```elixir
defmodule TestSchema do
  def schema do
    %GraphQL.Schema{
      query: %GraphQL.Type.ObjectType{
        name: "Hello",
        fields: %{
          greeting: %{
            type: %GraphQL.Type.String{},
            args: %{
              name: %{
                type: %GraphQL.Type.String{}
              }
            },
            resolve: {TestSchema, :greeting}
          }
        }
      }
    }
  end

  def greeting(_, %{name: name}, _), do: "Hello, #{name}!"
  def greeting(_, _, _), do: "Hello, world!"
end
```
  1. Your api pipeline should have this as a minimum:
```elixir
pipeline :api do
  plug :accepts, ["json"]
end
```
  1. Mount the GraphQL endpoint as follows:
```elixir
scope "/api" do
  pipe_through :api

  forward "/", GraphQL.Plug, schema: {TestSchema, :schema}
end
```
  1. Start Phoenix
```sh
mix phoenix.server
```
  1. Open your browser to http://localhost:4000/api?query={greeting} and you should see something like this:
```json
{
  "data": {
    "greeting": "Hello, world!"
  }
}
```

Contributions

This is pretty early days, the GraphQL Elixir ecosystem needs a lot more work to be useful.

However we can't get there without your help, so any questions, bug reports, feedback, feature requests and/or PRs are most welcome!

Acknowledgements

Thanks and appreciation goes to the following contributors for PRs, discussions, answering many questions and providing helpful feedback:

Thanks also to everyone who has submitted PRs, logged issues, given feedback or asked questions.