GraphQL Plug

Build Status Public Slack Discussion

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

Allows you to easily mount a GraphQL endpoint in Phoenix.

Installation

  1. Make a new Phoenix app, or add it to your existing app.

    mix phoenix.new hello_graphql --no-ecto
    cd hello_graphql

    Alternatively you could clone the Phoenix GraphQL example project repo

    git clone https://github.com/joshprice/hello_graphql_phoenix
  2. Add plug_graphql to your list of dependencies in mix.exs and install the package with mix deps.get.

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

Usage

  1. Define a simple schema in web/graphql/test_schema.ex:

    defmodule TestSchema do
      def schema do
        %GraphQL.Schema{
          query: %GraphQL.ObjectType{
            name: "RootQueryType",
            fields: %{
              greeting: %GraphQL.FieldDefinition{
                type: "String",
                resolve: &TestSchema.greeting/3
              }
            }
          }
        }
      end
    
      def greeting(_, %{name: name}, _), do: "Hello, #{name}!"
      def greeting(_, _, _), do: "Hello, world!"
    end
  2. Your api pipeline should have this as a minimum:

    pipeline :api do
      plug :accepts, ["json"]
    end
  3. Mount the GraphQL endpoint as follows:

    scope "/api" do
      pipe_through :api
    
      forward "/", GraphQL.Plug.Endpoint, schema: {TestSchema, :schema}
    end
  4. Start Phoenix

    mix phoenix.server
  5. Open your browser to http://localhost:4000/api?query={greeting} and you should see something like this:

    {
      "data": {
        "greeting": "Hello, world!"
      }
    }

Contributions

This is pretty early days, the graphql execution engine 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 answering many questions and providing helpful feedback:

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