Class: Tina4::GraphQL
- Inherits:
-
Object
- Object
- Tina4::GraphQL
- Defined in:
- lib/tina4/graphql.rb
Overview
─── Main GraphQL class ──────────────────────────────────────────────
Instance Attribute Summary collapse
-
#schema ⇒ Object
readonly
Return schema as GraphQL SDL string.
Instance Method Summary collapse
-
#execute(query, variables: {}, context: {}, operation_name: nil) ⇒ Object
Execute a query string directly.
-
#handle_request(body, context: {}) ⇒ Object
Handle an HTTP request body (JSON string).
-
#initialize(schema = nil) ⇒ GraphQL
constructor
A new instance of GraphQL.
-
#introspect ⇒ Object
Return schema metadata for debugging.
-
#register_route(path = "/graphql") ⇒ Object
── Route Registration ───────────────────────────────────────────── Register a POST /graphql route in the Tina4 router.
Constructor Details
#initialize(schema = nil) ⇒ GraphQL
Returns a new instance of GraphQL.
755 756 757 758 |
# File 'lib/tina4/graphql.rb', line 755 def initialize(schema = nil) @schema = schema || GraphQLSchema.new @executor = GraphQLExecutor.new(@schema) end |
Instance Attribute Details
#schema ⇒ Object (readonly)
Return schema as GraphQL SDL string.
772 773 774 |
# File 'lib/tina4/graphql.rb', line 772 def schema @schema end |
Instance Method Details
#execute(query, variables: {}, context: {}, operation_name: nil) ⇒ Object
Execute a query string directly
761 762 763 764 765 766 767 768 769 |
# File 'lib/tina4/graphql.rb', line 761 def execute(query, variables: {}, context: {}, operation_name: nil) parser = GraphQLParser.new(query) document = parser.parse @executor.execute(document, variables: variables, context: context, operation_name: operation_name) rescue GraphQLError => e { "data" => nil, "errors" => [{ "message" => e. }] } rescue => e { "data" => nil, "errors" => [{ "message" => "Internal error: #{e.}" }] } end |
#handle_request(body, context: {}) ⇒ Object
Handle an HTTP request body (JSON string)
808 809 810 811 812 813 814 815 816 817 |
# File 'lib/tina4/graphql.rb', line 808 def handle_request(body, context: {}) payload = JSON.parse(body) query = payload["query"] || "" variables = payload["variables"] || {} op_name = payload["operationName"] execute(query, variables: variables, context: context, operation_name: op_name) rescue JSON::ParserError { "data" => nil, "errors" => [{ "message" => "Invalid JSON in request body" }] } end |
#introspect ⇒ Object
Return schema metadata for debugging.
801 802 803 804 805 |
# File 'lib/tina4/graphql.rb', line 801 def introspect queries = @schema.queries.transform_values { |v| { type: v[:type], args: v[:args] || {} } } mutations = @schema.mutations.transform_values { |v| { type: v[:type], args: v[:args] || {} } } { types: @schema.types.keys, queries: queries, mutations: mutations } end |
#register_route(path = "/graphql") ⇒ Object
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 |
# File 'lib/tina4/graphql.rb', line 826 def register_route(path = "/graphql") graphql = self Tina4.post path, auth: false do |request, response| body = request.body result = graphql.handle_request(body, context: { request: request }) response.json(result) end # Optional: GET for GraphiQL/introspection Tina4.get path, auth: false do |request, response| query = request.params["query"] if query variables = request.params["variables"] variables = JSON.parse(variables) if variables.is_a?(String) && !variables.empty? result = graphql.execute(query, variables: variables || {}, context: { request: request }) response.json(result) else response.html(graphiql_html(path)) end end end |