package main import ( "bytes" "io" "net/http" "path" "strconv" "strings" "hakurei.app/internal/rosa" ) func serveCount(index *PackageIndex) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "text/plain; charset=utf-8") count := len(index.names) w.Write([]byte(strconv.Itoa(count))) } } func serveStatus(index *PackageIndex) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { if index == nil { http.Error(w, "index is nil", http.StatusInternalServerError) return } base := path.Base(r.URL.Path) name := strings.TrimSuffix(base, ".log") p, ok := rosa.ResolveName(name) if !ok { http.NotFound(w, r) return } m := rosa.GetMetadata(p) pk, ok := index.names[m.Name] if !ok { http.NotFound(w, r) return } if len(pk.status) > 0 { w.Header().Set("Content-Type", "text/plain; charset=utf-8") w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") w.WriteHeader(http.StatusOK) _, err := io.Copy(w, bytes.NewReader(pk.status)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } else { http.NotFound(w, r) } } } func apiRoutes(index *PackageIndex) { http.HandleFunc("GET /api/count", serveCount(index)) http.HandleFunc("GET /api/status/", serveStatus(index)) }