Packages
graphqexl
0.1.0-alpha-rc.24
0.1.0
0.1.0-alpha-rc.docs-test-6
0.1.0-alpha-rc.docs-test-5
0.1.0-alpha-rc.docs-test-4
0.1.0-alpha-rc.docs-test-3
0.1.0-alpha-rc.docs-test-2
0.1.0-alpha-rc.docs-test
0.1.0-alpha-rc.25
0.1.0-alpha-rc.24
0.1.0-alpha-rc.23
0.1.0-alpha-rc.22
0.1.0-alpha-rc.21
0.1.0-alpha-rc.20
0.1.0-alpha-rc.19
0.1.0-alpha-rc.18
0.1.0-alpha-rc.17
0.1.0-alpha-rc.16
0.1.0-alpha-rc.15
0.1.0-alpha-rc.14
0.1.0-alpha-rc.13
0.1.0-alpha-rc.12
0.1.0-alpha-rc.11
0.1.0-alpha-rc.10
0.1.0-alpha-rc.9
0.1.0-alpha-rc.8
0.1.0-alpha-rc.7
0.1.0-alpha-rc.6
0.1.0-alpha-rc.5
0.1.0-alpha-rc.4
0.1.0-alpha-rc.3
0.1.0-alpha-rc.2
0.1.0-alpha-rc.1
0.1.0-alpha.rc-4
0.1.0-alpha.rc.4
Fully-loaded, pure-Elixir GraphQL server implementation with developer tools
Current section
Files
Jump to
Current section
Files
lib/graphqexl/server/plug.ex
alias Graphqexl.Query.ResultSet
defmodule Graphqexl.Server.Plug do
@moduledoc """
Server `Plug` to handle parsing and executing GraphQL queries, which can be given as
`application/json` or `application/graphql`
TODO: Error handling/rendering
"""
@moduledoc since: "0.1.0"
import Plug.Conn
@type json:: Map.t
@doc """
Init callback invoked when a request matching a route including this `t:Plug.t/0` is being
prepared for handled.
Returns: `t:list(term.t/0)`
"""
@doc since: "0.1.0"
@spec init(list):: list
def init(options), do: options
@doc """
Call callback invoked when a request matching a route including this `t:Plug.t/0` is handled.
Returns: `t:Plug.Conn.t/0`
"""
@doc since: "0.1.0"
@spec call(Plug.Conn.t, list):: Plug.Conn.t
def call(conn, _opts) do
# TODO: content negotiation: application/json and application/graphql
conn
|> put_resp_content_type("application/json")
# TODO: determine status
|> send_result
end
@doc false
@spec send_result(Plug.Conn.t):: Plug.Conn.t
defp send_result(conn) do
conn.body_params
|> Map.get("q")
|> Graphqexl.Query.parse
|> Graphqexl.Query.execute(conn.assigns[:schema])
|> serialize
|> respond(conn, 200)
end
@doc false
@spec respond(json, Plug.Conn.t, integer):: Plug.Conn.t
defp respond(response, conn, status), do: conn |> send_resp(status, response)
@doc false
@spec serialize(ResultSet.t):: String.t
defp serialize(result), do: result |> Jason.encode |> elem(1)
end