package view import ( "encoding/json" "fmt" "local/whodunit/config" "local/whodunit/storage" "local/whodunit/storage/entity" "log" "net/http" ) func Html(g storage.Graph) error { port := config.New().Port log.Println("listening on", port) err := http.ListenAndServe(fmt.Sprintf(":%d", port), foo(g)) return err } func foo(g storage.Graph) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var err error switch r.URL.Path { case "/who": err = who(g, w, r) default: http.NotFound(w, r) return } if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }) } func who(g storage.Graph, w http.ResponseWriter, r *http.Request) error { ids := r.URL.Query()["id"] _, verbose := r.URL.Query()["v"] results := make(map[string]entity.One) for i := 0; i < len(ids); i++ { id := ids[i] ones, err := g.List(r.Context(), id) if err != nil { return err } if len(ones) != 1 { ones = append(ones, entity.One{}) } one := ones[0] results[id] = one if verbose { ones, err := g.List(r.Context(), one.Peers()...) if err != nil { return err } for i, one := range ones { one.Connections = nil results[id].Connections[i] = one } } } log.Println("results:", results) return json.NewEncoder(w).Encode(results) }