| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | /* * EliasDB * * Copyright 2016 Matthias Ladkau. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */package v1import (	"encoding/json"	"net/http"	"devt.de/krotik/common/stringutil"	"devt.de/krotik/eliasdb/api"	"devt.de/krotik/eliasdb/graphql")/*EndpointGraphQLQuery is a query-only GraphQL endpoint URL (rooted). Handleseverything under graphql-query/...*/const EndpointGraphQLQuery = api.APIRoot + APIv1 + "/graphql-query/"/*GraphQLQueryEndpointInst creates a new endpoint handler.*/func GraphQLQueryEndpointInst() api.RestEndpointHandler {	return &graphQLQueryEndpoint{}}/*Handler object for GraphQL operations.*/type graphQLQueryEndpoint struct {	*api.DefaultEndpointHandler}/*HandleGET handles GraphQL queries.*/func (e *graphQLQueryEndpoint) HandleGET(w http.ResponseWriter, r *http.Request, resources []string) {	gqlquery := map[string]interface{}{		"variables":     nil,		"operationName": nil,	}	partition := r.URL.Query().Get("partition")	if partition == "" && len(resources) > 0 {		partition = resources[0]	}	if partition == "" {		http.Error(w, "Need a partition", http.StatusBadRequest)		return	}	query := r.URL.Query().Get("query")	if query == "" {		http.Error(w, "Need a query parameter", http.StatusBadRequest)		return	}	gqlquery["query"] = query	if operationName := r.URL.Query().Get("operationName"); operationName != "" {		gqlquery["operationName"] = operationName	}	if variables := r.URL.Query().Get("variables"); variables != "" {		varData := make(map[string]interface{})		if err := json.Unmarshal([]byte(variables), &varData); err != nil {			http.Error(w, "Could not decode variables: "+err.Error(), http.StatusBadRequest)			return		}		gqlquery["variables"] = varData	}	res, err := graphql.RunQuery(stringutil.CreateDisplayString(partition)+" query",		partition, gqlquery, api.GM, nil, true)	if err != nil {		http.Error(w, err.Error(), http.StatusBadRequest)		return	}	w.Header().Set("content-type", "application/json; charset=utf-8")	json.NewEncoder(w).Encode(res)}/*SwaggerDefs is used to describe the endpoint in swagger.*/func (e *graphQLQueryEndpoint) SwaggerDefs(s map[string]interface{}) {	s["paths"].(map[string]interface{})["/v1/graphql-query/{partition}"] = map[string]interface{}{		"get": map[string]interface{}{			"summary":     "GraphQL interface which only executes non-modifying queries.",			"description": "The GraphQL interface can be used to query data.",			"consumes": []string{				"application/json",			},			"produces": []string{				"text/plain",				"application/json",			},			"parameters": []map[string]interface{}{				{					"name":        "partition",					"in":          "path",					"description": "Partition to query.",					"required":    true,					"type":        "string",				},				{					"name":        "operationName",					"in":          "query",					"description": "GraphQL query operation name.",					"required":    false,					"type":        "string",				},				{					"name":        "query",					"in":          "query",					"description": "GraphQL query.",					"required":    true,					"type":        "string",				},				{					"name":        "variables",					"in":          "query",					"description": "GraphQL query variable values.",					"required":    false,					"type":        "string",				},			},			"responses": map[string]interface{}{				"200": map[string]interface{}{					"description": "The operation was successful.",				},				"default": map[string]interface{}{					"description": "Error response",					"schema": map[string]interface{}{						"$ref": "#/definitions/Error",					},				},			},		},	}}
 |