Current section
Files
Jump to
Current section
Files
lib/graphql/plug.ex
defmodule GraphQL.Plug do
@moduledoc """
This is the primary plug for mounting a GraphQL server.
It includes GraphiQL support and a default pipeline
which parses various content-types for POSTs
(including `application/graphql`, `application/json`, form and multipart).
You mount `GraphQL.Plug` using Plug or Phoenix, and pass it your schema:
```elixir
forward "/graphql", GraphQL.Plug, schema: {MyApp.Schema, :schema}
```
You can build your own pipeline by mounting the
`GraphQL.Plug.Endpoint` plug directly. You may want to preserve how this
pipeline configures the `Plug.Parsers` in that case.
"""
use Plug.Builder
alias GraphQL.Schema
alias GraphQL.Plug.{GraphiQL, Endpoint}
alias Plug.Parsers
require Logger
plug Parsers,
parsers: [:graphql, :urlencoded, :multipart, :json],
pass: ["*/*"],
json_decoder: Poison
@type init :: %{
schema: Schema.t,
root_value: ConfigurableValue.t,
query: ConfigurableValue.t,
allow_graphiql?: true | false
}
@spec init(Map) :: init
def init(opts) do
graphiql = GraphiQL.init(opts)
endpoint = Endpoint.init(opts)
opts = Keyword.merge(graphiql, endpoint)
Enum.dedup(opts)
end
def call(conn, opts) do
conn = super(conn, opts)
conn = if GraphiQL.use_graphiql?(conn, opts) do
GraphiQL.call(conn, opts)
else
Endpoint.call(conn, opts)
end
# TODO consider not logging instrospection queries
Logger.debug """
Processed GraphQL query:
#{conn.params["query"]}
"""
conn
end
end