func (t *TopologyApi) topologySearch(w http.ResponseWriter, r *auth.AuthenticatedRequest) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") resource := Topology{} data, _ := ioutil.ReadAll(r.Body) if len(data) != 0 { if err := json.Unmarshal(data, &resource); err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } if err := validator.Validate(resource); err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } } if resource.GremlinQuery == "" { w.WriteHeader(http.StatusNoContent) return } tr := traversal.NewGremlinTraversalParser(strings.NewReader(resource.GremlinQuery), t.Graph) tr.AddTraversalExtension(topology.NewTopologyTraversalExtension()) if t.TableClient != nil { tr.AddTraversalExtension(ftraversal.NewFlowTraversalExtension(t.TableClient, t.Storage)) } ts, err := tr.Parse() if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } res, err := ts.Exec() if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } w.WriteHeader(http.StatusOK) if err := json.NewEncoder(w).Encode(res); err != nil { panic(err) } }
func isGremlinExpr(v interface{}, param string) error { query, ok := v.(string) if !ok { return GremlinNotValid(errors.New("not a string")) } tr := traversal.NewGremlinTraversalParser(strings.NewReader(query), &graph.Graph{}) tr.AddTraversalExtension(topology.NewTopologyTraversalExtension()) tr.AddTraversalExtension(ftraversal.NewFlowTraversalExtension(nil, nil)) if _, err := tr.Parse(); err != nil { return GremlinNotValid(err) } return nil }