vanity/router/router.go

95 lines
2.0 KiB
Go

package router
import (
"encoding/json"
"fmt"
"html/template"
"net/http"
"strings"
"time"
"go.jolheiser.com/vanity/flags"
"go.jolheiser.com/vanity/service"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"go.jolheiser.com/beaver"
)
var tmpl *template.Template
func Init() (*chi.Mux, error) {
var err error
tmpl, err = Templates()
if err != nil {
return nil, err
}
r := chi.NewRouter()
r.Use(middleware.RedirectSlashes)
r.Use(middleware.Recoverer)
r.Use(middleware.Timeout(30 * time.Second))
r.Get("/", doIndex)
r.Head("/", doUpdate)
r.Get("/*", doVanity)
svc = service.New()
beaver.Info("Warming up cache...")
updateCache()
beaver.Infof("Finished warming up cache: %s", cache.Names())
go cronStart()
beaver.Infof("Running vanity server at http://localhost:%d", flags.Port)
return r, nil
}
func doIndex(res http.ResponseWriter, _ *http.Request) {
if err := tmpl.Lookup("index.tmpl").Execute(res, map[string]interface{}{
"Packages": cache.packages,
"Index": true,
}); err != nil {
beaver.Errorf("could not write response: %v", err)
}
}
func doVanity(res http.ResponseWriter, req *http.Request) {
key := chi.URLParam(req, "*")
pkg, ok := cache.packages[strings.Split(key, "/")[0]]
if !ok {
http.NotFound(res, req)
return
}
if err := tmpl.Lookup("vanity.tmpl").Execute(res, map[string]interface{}{
"Package": pkg,
"Module": pkg.Module(flags.Domain),
"GoSource": fmt.Sprintf("%s %s %s %s", pkg.Module(flags.Domain), pkg.CloneHTTP, svc.GoDir(pkg), svc.GoFile(pkg)),
"Index": false,
}); err != nil {
beaver.Errorf("could not write response: %v", err)
}
}
func doUpdate(res http.ResponseWriter, _ *http.Request) {
res.Header().Set("Content-Type", "application/json")
resp := map[string]bool{
"updated": false,
}
if canUpdate {
updateCache()
resp["updated"] = true
}
payload, err := json.Marshal(resp)
if err != nil {
beaver.Errorf("could not marshal payload: %v", err)
}
if _, err = res.Write(payload); err != nil {
beaver.Errorf("could not write response: %v", err)
}
}