package handler
import (
"fmt"
"html/template"
"net/http"
"strconv"
"time"
"uptimemonitor"
"uptimemonitor/html"
)
func (h *Handler) ListChecks() http.HandlerFunc {
tmpl := template.Must(template.New("check.html").Funcs(template.FuncMap{
"sub": func(a, b int) int {
return a - b
},
}).ParseFS(html.FS, "check.html"))
type data struct {
Monitor uptimemonitor.Monitor
Checks []uptimemonitor.Check
Skeletons []int
MaxTime int64
StartTime string
EndTime string
}
return func(w http.ResponseWriter, r *http.Request) {
monitorID, err := strconv.Atoi(r.PathValue("monitor"))
if err != nil {
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
monitor, err := h.Store.GetMonitorByID(r.Context(), monitorID)
if err != nil || monitor.ID == 0 {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
checks, err := h.Store.ListChecks(r.Context(), int64(monitorID), 60)
if err != nil {
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
maxTime := int64(0)
for _, check := range checks {
if check.ResponseTimeMs > maxTime {
maxTime = check.ResponseTimeMs
}
}
err = tmpl.ExecuteTemplate(w, "check_list", data{
Monitor: monitor,
Checks: checks,
Skeletons: make([]int, 60),
MaxTime: maxTime,
StartTime: time.Now().Add(-1 * time.Hour).Format("15:04"),
EndTime: time.Now().Format("15:04"),
})
if err != nil {
http.Error(w, fmt.Sprintf("%v", err), http.StatusInternalServerError)
return
}
}
}