package view import ( "encoding/json" "fmt" "local/dndex/config" "local/dndex/storage" "local/gziphttp" "log" "net/http" "strings" ) func JSON(g storage.Graph) error { port := config.New().Port log.Println("listening on", port) err := http.ListenAndServe(fmt.Sprintf(":%d", port), jsonHandler(g)) return err } func jsonHandler(g storage.Graph) http.Handler { mux := http.NewServeMux() routes := []struct { path string foo func(g storage.Graph, w http.ResponseWriter, r *http.Request) error }{ { path: "/who/", foo: who, }, } for _, route := range routes { path := route.path nopath := strings.TrimRight(route.path, "/") foo := route.foo mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { if err := foo(g, w, r); err != nil { status := http.StatusInternalServerError if strings.Contains(err.Error(), "collision") { status = http.StatusConflict } b, _ := json.Marshal(map[string]string{"error": err.Error()}) http.Error(w, string(b), status) } }) mux.HandleFunc(nopath, http.NotFound) } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") if gziphttp.Can(r) { gz := gziphttp.New(w) defer gz.Close() w = gz } mux.ServeHTTP(w, r) }) }