| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /* * 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"	"fmt"	"net/http"	"devt.de/krotik/eliasdb/api")/*EndpointInfoQuery is the info endpoint URL (rooted). Handles everything under info/...*/const EndpointInfoQuery = api.APIRoot + APIv1 + "/info/"/*InfoEndpointInst creates a new endpoint handler.*/func InfoEndpointInst() api.RestEndpointHandler {	return &infoEndpoint{}}/*Handler object for info queries.*/type infoEndpoint struct {	*api.DefaultEndpointHandler}/*HandleGET handles a info query REST call.*/func (ie *infoEndpoint) HandleGET(w http.ResponseWriter, r *http.Request, resources []string) {	data := make(map[string]interface{})	if len(resources) > 0 {		if resources[0] == "kind" {			// Kind info is requested			if len(resources) == 1 {				http.Error(w, "Missing node kind", http.StatusBadRequest)				return			}			na := api.GM.NodeAttrs(resources[1])			ea := api.GM.EdgeAttrs(resources[1])			if len(na) == 0 && len(ea) == 0 {				http.Error(w, fmt.Sprint("Unknown node kind ", resources[1]), http.StatusBadRequest)				return			}			data["node_attrs"] = na			data["node_edges"] = api.GM.NodeEdges(resources[1])			data["edge_attrs"] = ea		}	} else {		// Get general information		data["partitions"] = api.GM.Partitions()		nks := api.GM.NodeKinds()		data["node_kinds"] = nks		ncs := make(map[string]uint64)		for _, nk := range nks {			ncs[nk] = api.GM.NodeCount(nk)		}		data["node_counts"] = ncs		eks := api.GM.EdgeKinds()		data["edge_kinds"] = eks		ecs := make(map[string]uint64)		for _, ek := range eks {			ecs[ek] = api.GM.EdgeCount(ek)		}		data["edge_counts"] = ecs	}	// Write data	w.Header().Set("content-type", "application/json; charset=utf-8")	ret := json.NewEncoder(w)	ret.Encode(data)}/*SwaggerDefs is used to describe the endpoint in swagger.*/func (ie *infoEndpoint) SwaggerDefs(s map[string]interface{}) {	s["paths"].(map[string]interface{})["/v1/info"] = map[string]interface{}{		"get": map[string]interface{}{			"summary":     "Return general datastore information.",			"description": "The info endpoint returns general database information such as known node kinds, known attributes, etc.",			"produces": []string{				"text/plain",				"application/json",			},			"responses": map[string]interface{}{				"200": map[string]interface{}{					"description": "A key-value map.",				},				"default": map[string]interface{}{					"description": "Error response",					"schema": map[string]interface{}{						"$ref": "#/definitions/Error",					},				},			},		},	}	s["paths"].(map[string]interface{})["/v1/info/kind/{kind}"] = map[string]interface{}{		"get": map[string]interface{}{			"summary":     "Return information on a given node or edge kind.",			"description": "The info kind endpoint returns information on a given node kind such as known attributes and edges.",			"produces": []string{				"text/plain",				"application/json",			},			"parameters": []map[string]interface{}{				{					"name":        "kind",					"in":          "path",					"description": "Node or edge kind to be queried.",					"required":    true,					"type":        "string",				},			},			"responses": map[string]interface{}{				"200": map[string]interface{}{					"description": "A key-value map.",				},				"default": map[string]interface{}{					"description": "Error response",					"schema": map[string]interface{}{						"$ref": "#/definitions/Error",					},				},			},		},	}	// Add generic error object to definition	s["definitions"].(map[string]interface{})["Error"] = map[string]interface{}{		"description": "A human readable error mesage.",		"type":        "string",	}}
 |