@@ -19,6 +19,9 @@ defmodule GraphQL.Plug.Endpoint do
1919
2020 import Plug.Conn
2121 alias Plug.Conn
22+ alias GraphQL.Plug.BareEndpoint
23+ alias GraphQL.Plug.RootValue
24+ alias GraphQL.Plug.Parameters
2225
2326 @ behaviour Plug
2427
@@ -46,40 +49,29 @@ defmodule GraphQL.Plug.Endpoint do
4649 [ :graphiql_version , :query , :variables , :result ]
4750
4851 def init ( opts ) do
49- schema = case Keyword . get ( opts , :schema ) do
50- { mod , func } -> apply ( mod , func , [ ] )
51- s -> s
52- end
53- root_value = Keyword . get ( opts , :root_value , % { } )
54- % { schema: schema , root_value: root_value }
52+ BareEndpoint . init ( opts )
5553 end
5654
5755 def call ( % Conn { method: m } = conn , opts ) when m in [ "GET" , "POST" ] do
5856 % { schema: schema , root_value: root_value } = conn . assigns [ :graphql_options ] || opts
5957
60- query = query ( conn )
61- variables = variables ( conn )
62- operation_name = operation_name ( conn )
63- evaluated_root_value = evaluate_root_value ( conn , root_value )
58+ query = Parameters . query ( conn )
59+ variables = Parameters . variables ( conn )
60+ operation_name = Parameters . operation_name ( conn )
61+ evaluated_root_value = RootValue . evaluate ( conn , root_value )
6462
6563 cond do
6664 use_graphiql? ( conn ) ->
6765 handle_graphiql_call ( conn , schema , evaluated_root_value , query , variables , operation_name )
6866 query ->
69- handle_call ( conn , schema , evaluated_root_value , query , variables , operation_name )
67+ BareEndpoint . handle_call ( conn , schema , evaluated_root_value , query , variables , operation_name )
7068 true ->
71- handle_error ( conn , "Must provide query string." )
69+ BareEndpoint . handle_error ( conn , "Must provide query string." )
7270 end
7371 end
7472
7573 def call ( % Conn { method: _ } = conn , _ ) do
76- handle_error ( conn , "GraphQL only supports GET and POST requests." )
77- end
78-
79- defp handle_call ( conn , schema , root_value , query , variables , operation_name ) do
80- conn
81- |> put_resp_content_type ( "application/json" )
82- |> execute ( schema , root_value , query , variables , operation_name )
74+ BareEndpoint . handle_error ( conn , "GraphQL only supports GET and POST requests." )
8375 end
8476
8577 defp escape_string ( s ) do
@@ -94,72 +86,13 @@ defmodule GraphQL.Plug.Endpoint do
9486 { _ , data } = GraphQL . execute ( schema , query , root_value , variables , operation_name )
9587 { :ok , variables } = Poison . encode ( variables , pretty: true )
9688 { :ok , result } = Poison . encode ( data , pretty: true )
89+
9790 graphiql = graphiql_html ( @ graphiql_version , escape_string ( query ) , escape_string ( variables ) , escape_string ( result ) )
9891 conn
9992 |> put_resp_content_type ( "text/html" )
10093 |> send_resp ( 200 , graphiql )
10194 end
10295
103- defp handle_error ( conn , message ) do
104- { :ok , errors } = Poison . encode % { errors: [ % { message: message } ] }
105- conn
106- |> put_resp_content_type ( "application/json" )
107- |> send_resp ( 400 , errors )
108- end
109-
110- defp execute ( conn , schema , root_value , query , variables , operation_name ) do
111- case GraphQL . execute ( schema , query , root_value , variables , operation_name ) do
112- { :ok , data } ->
113- case Poison . encode ( data ) do
114- { :ok , json } -> send_resp ( conn , 200 , json )
115- { :error , errors } -> send_resp ( conn , 400 , errors )
116- end
117- { :error , errors } ->
118- case Poison . encode ( errors ) do
119- { :ok , json } -> send_resp ( conn , 400 , json )
120- { :error , errors } -> send_resp ( conn , 400 , errors )
121- end
122- end
123- end
124-
125- defp evaluate_root_value ( conn , { mod , func } ) do
126- apply ( mod , func , [ conn ] )
127- end
128-
129- defp evaluate_root_value ( conn , root_fn ) when is_function ( root_fn , 1 ) do
130- apply ( root_fn , [ conn ] )
131- end
132-
133- defp evaluate_root_value ( _ , nil ) do
134- % { }
135- end
136-
137- defp evaluate_root_value ( _ , root_value ) do
138- root_value
139- end
140-
141- defp query ( conn ) do
142- query = Map . get ( conn . params , "query" )
143- if query && String . strip ( query ) != "" , do: query , else: nil
144- end
145-
146- defp variables ( conn ) do
147- decode_variables Map . get ( conn . params , "variables" , % { } )
148- end
149-
150- defp decode_variables ( variables ) when is_binary ( variables ) do
151- case Poison . decode ( variables ) do
152- { :ok , variables } -> variables
153- { :error , _ } -> % { } # express-graphql ignores these errors currently
154- end
155- end
156- defp decode_variables ( vars ) , do: vars
157-
158- defp operation_name ( conn ) do
159- Map . get ( conn . params , "operationName" ) ||
160- Map . get ( conn . params , "operation_name" )
161- end
162-
16396 defp use_graphiql? ( conn ) do
16497 case get_req_header ( conn , "accept" ) do
16598 [ accept_header | _ ] ->
0 commit comments