115 lines
2.5 KiB
Go
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))
|
|
}
|