searchhut/cmd/sh-web/main.go
2022-07-11 13:13:05 +02:00

115 lines
2.5 KiB
Go

package main
import (
"html/template"
"log"
"net/http"
"time"
"git.sr.ht/~emersion/gqlclient"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"git.sr.ht/~sircmpwn/searchhut/config"
"git.sr.ht/~sircmpwn/searchhut/query"
)
type IndexPage struct {
Page string
Title string
Query string
}
type SearchPage struct {
Page string
Title string
Query string
Results []query.Result
}
type AboutPage struct {
Page string
Title string
CrawlerUA string
}
func main() {
conf := config.Load()
port, ok := conf.Get("searchhut::web", "bind")
if !ok {
port = ":8081"
}
router := chi.NewRouter()
router.Use(middleware.RealIP)
router.Use(middleware.Logger)
router.Use(middleware.Timeout(10 * time.Second))
// TODO: Let the user install these somewhere else
tmpl, err := template.ParseGlob("templates/*.html")
if err != nil {
panic(err)
}
fs := http.FileServer(http.Dir("./static"))
router.Handle("/static/*", http.StripPrefix("/static/", fs))
// TODO: Fetch me from config
client := gqlclient.New("http://localhost:8080/query", nil)
router.Get("/", func(w http.ResponseWriter, r *http.Request) {
err := tmpl.ExecuteTemplate(w, "index.html", &IndexPage{
Page: "index",
Title: "searchhut",
})
if err != nil {
log.Println(err)
http.Error(w, "Error displaying page", http.StatusInternalServerError)
return
}
})
router.Get("/search", func(w http.ResponseWriter, r *http.Request) {
q := r.FormValue("q")
if q == "" {
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return
}
results, err := query.Search(client, r.Context(), q)
if err != nil {
log.Println(err)
http.Error(w, "Error performing search query", http.StatusInternalServerError)
return
}
err = tmpl.ExecuteTemplate(w, "search.html", &SearchPage{
Page: "search",
Title: q + ": searchhut",
Query: q,
Results: results,
})
if err != nil {
log.Println(err)
http.Error(w, "Error displaying page", http.StatusInternalServerError)
return
}
})
router.Get("/about", func(w http.ResponseWriter, r *http.Request) {
ua, ok := conf.Get("searchhut", "user-agent")
if !ok {
ua = ""
}
err := tmpl.ExecuteTemplate(w, "about.html", &AboutPage{
Title: "About searchhut",
Page: "about",
CrawlerUA: ua,
})
if err != nil {
log.Println(err)
http.Error(w, "Error displaying page", http.StatusInternalServerError)
return
}
})
log.Printf("Running server on %s", port)
log.Fatal(http.ListenAndServe(port, router))
}