package web import ( "net/http" "os" "time" "code.chrissexton.org/cws/cabinet/db" packr "github.com/gobuffalo/packr/v2" "github.com/speps/go-hashids" "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/rs/zerolog/log" "github.com/stretchr/graceful" ) type Web struct { addr string db *db.Database salt string h *hashids.HashID box *packr.Box } func New(addr string, db *db.Database, box *packr.Box) *Web { w := &Web{ addr: addr, db: db, box: box, } if err := db.MakeDB(); err != nil { log.Fatal(). Err(err). Msg("could not create database") } return w } func (web *Web) routeSetup() http.Handler { r := mux.NewRouter() api := r.PathPrefix("/v1/").Subrouter() api.HandleFunc("/entries", web.allEntries).Methods(http.MethodGet) api.HandleFunc("/entries", web.newEntry).Methods(http.MethodPost) api.HandleFunc("/entries/{slug}", web.removeEntry).Methods(http.MethodDelete) api.HandleFunc("/entries/{slug}", web.editEntry).Methods(http.MethodPut) api.HandleFunc("/entries/{slug}", web.getEntry).Methods(http.MethodGet) r.PathPrefix("/").HandlerFunc(web.indexHandler("/index.html")) loggedRouter := handlers.LoggingHandler(os.Stdout, r) return loggedRouter } func (web *Web) Serve() { middle := web.routeSetup() log.Info().Str("addr", "http://"+web.addr).Msg("serving HTTP") graceful.Run(web.addr, 10*time.Second, middle) }