func httpServer(db *db.DB) error { http.HandleFunc("/json/", func(w http.ResponseWriter, r *http.Request) { dtMin := time.Now().Add(-time.Hour * 24 * 7 * 4) dtMax := time.Now().Add(time.Minute) { type stp struct { t *time.Time qp string } for _, v := range []stp{ {&dtMin, "dt_min"}, {&dtMax, "dt_max"}, } { ts := r.URL.Query().Get(v.qp) t, err := time.Parse(time.RFC3339, ts) if err != nil { t, err = time.Parse("2006-01-02", ts) if err != nil { continue } } *v.t = t } } avgMinutes := 10 if r.URL.Query().Get("avg_minutes") != "" { var err error avgMinutes, err = strconv.Atoi(r.URL.Query().Get("avg_minutes")) if err != nil { lg.Fatalln(err) } } allEntries, err := db.All() var filteredEntires []omron.Entry for _, entry := range allEntries { if entry.Time.After(dtMin) && entry.Time.Before(dtMax) { filteredEntires = append(filteredEntires, entry) } } avgEntries := omron.AvgWithinDuration( filteredEntires, time.Duration(avgMinutes)*time.Minute) scoredEntries := score.All(avgEntries) w.Header().Set("Content-type", "application/json") data, err := json.MarshalIndent(scoredEntries, "", " ") if err != nil { lg.Fatal(err) } w.Write(data) }) http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer( http.Dir("build/assets")))) http.Handle("/", http.FileServer( http.Dir("browser/html"))) return http.ListenAndServe(":8080", nil) }