diff --git a/internal/handlers/handlelogin.go b/internal/handlers/handlelogin.go deleted file mode 100644 index 0dad604..0000000 --- a/internal/handlers/handlelogin.go +++ /dev/null @@ -1,12 +0,0 @@ -package handlers - -import ( - "fmt" - "net/http" -) - -func (s *Handlers) HandleLogin() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "hello login") - } -} diff --git a/internal/handlers/handlehealthcheck.go b/internal/handlers/healthcheck.go similarity index 100% rename from internal/handlers/handlehealthcheck.go rename to internal/handlers/healthcheck.go diff --git a/internal/handlers/handleindex.go b/internal/handlers/index.go similarity index 63% rename from internal/handlers/handleindex.go rename to internal/handlers/index.go index e91fedc..7895d49 100644 --- a/internal/handlers/handleindex.go +++ b/internal/handlers/index.go @@ -1,17 +1,16 @@ package handlers import ( - "html/template" "net/http" "git.eeqj.de/sneak/gohttpserver/templates" ) func (s *Handlers) HandleIndex() http.HandlerFunc { - indexTemplate := template.Must(template.New("index").Parse(templates.MustString("index.html"))) + t := templates.GetParsed() return func(w http.ResponseWriter, r *http.Request) { - err := indexTemplate.ExecuteTemplate(w, "index", nil) + err := t.ExecuteTemplate(w, "index.html", nil) if err != nil { s.log.Error().Err(err).Msg("") http.Error(w, http.StatusText(500), 500) diff --git a/internal/handlers/login.go b/internal/handlers/login.go new file mode 100644 index 0000000..f15b847 --- /dev/null +++ b/internal/handlers/login.go @@ -0,0 +1,19 @@ +package handlers + +import ( + "net/http" + + "git.eeqj.de/sneak/gohttpserver/templates" +) + +func (s *Handlers) HandleLoginGET() http.HandlerFunc { + t := templates.GetParsed() + + return func(w http.ResponseWriter, r *http.Request) { + err := t.ExecuteTemplate(w, "login.html", nil) + if err != nil { + s.log.Error().Err(err).Msg("") + http.Error(w, http.StatusText(500), 500) + } + } +} diff --git a/internal/handlers/handlenow.go b/internal/handlers/now.go similarity index 100% rename from internal/handlers/handlenow.go rename to internal/handlers/now.go diff --git a/internal/handlers/handlepanic.go b/internal/handlers/panic.go similarity index 100% rename from internal/handlers/handlepanic.go rename to internal/handlers/panic.go diff --git a/internal/middleware/middleware.go b/internal/middleware/middleware.go index 2686665..a6605ed 100644 --- a/internal/middleware/middleware.go +++ b/internal/middleware/middleware.go @@ -69,7 +69,7 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) { // type Middleware func(http.Handler) http.Handler // this returns a Middleware that is designed to do every request through the // mux, note the signature: -func (s *Middleware) LoggingMiddleware() func(http.Handler) http.Handler { +func (s *Middleware) Logging() func(http.Handler) http.Handler { // FIXME this should use https://github.com/google/go-cloud/blob/master/server/requestlog/requestlog.go return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -97,7 +97,7 @@ func (s *Middleware) LoggingMiddleware() func(http.Handler) http.Handler { } } -func (s *Middleware) CORSMiddleware() func(http.Handler) http.Handler { +func (s *Middleware) CORS() func(http.Handler) http.Handler { return cors.Handler(cors.Options{ // CHANGEME! these are defaults, change them to suit your needs or // read from environment/viper. @@ -112,7 +112,7 @@ func (s *Middleware) CORSMiddleware() func(http.Handler) http.Handler { }) } -func (s *Middleware) AuthMiddleware() func(http.Handler) http.Handler { +func (s *Middleware) Auth() func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // CHANGEME you'll want to change this to do stuff. @@ -122,7 +122,7 @@ func (s *Middleware) AuthMiddleware() func(http.Handler) http.Handler { } } -func (s *Middleware) MetricsMiddleware() func(http.Handler) http.Handler { +func (s *Middleware) Metrics() func(http.Handler) http.Handler { mdlw := ghmm.New(ghmm.Config{ Recorder: metrics.NewRecorder(metrics.Config{}), }) @@ -131,7 +131,7 @@ func (s *Middleware) MetricsMiddleware() func(http.Handler) http.Handler { } } -func (s *Middleware) MetricsAuthMiddleware() func(http.Handler) http.Handler { +func (s *Middleware) MetricsAuth() func(http.Handler) http.Handler { return basicauth.New( "metrics", map[string][]string{ diff --git a/internal/server/http.go b/internal/server/http.go index 07efa29..6c25ffc 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -7,7 +7,7 @@ import ( ) func (s *Server) serveUntilShutdown() { - listenAddr := fmt.Sprintf(":%d", s.port) + listenAddr := fmt.Sprintf(":%d", s.params.Config.Port) s.httpServer = &http.Server{ Addr: listenAddr, ReadTimeout: 10 * time.Second, diff --git a/internal/server/routes.go b/internal/server/routes.go index b283a5a..bfdffed 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -23,16 +23,16 @@ func (s *Server) SetupRoutes() { s.router.Use(middleware.Recoverer) s.router.Use(middleware.RequestID) - s.router.Use(s.mw.LoggingMiddleware()) + s.router.Use(s.mw.Logging()) // add metrics middleware only if we can serve them behind auth if viper.GetString("METRICS_USERNAME") != "" { - s.router.Use(s.mw.MetricsMiddleware()) + s.router.Use(s.mw.Metrics()) } // set up CORS headers. you'll probably want to configure that // in middlewares.go. - s.router.Use(s.mw.CORSMiddleware()) + s.router.Use(s.mw.CORS()) // CHANGEME to suit your needs, or pull from config. // timeout for request context; your handlers must finish within @@ -68,12 +68,21 @@ func (s *Server) SetupRoutes() { // if you want to use a general purpose middleware (http.Handler // wrapper) on a specific HandleFunc route, you need to take the // .ServeHTTP of the http.Handler to get its HandleFunc, viz: - authMiddleware := s.mw.AuthMiddleware() + auth := s.mw.Auth() s.router.Get( "/login", - authMiddleware(s.h.HandleLogin()).ServeHTTP, + auth(s.h.HandleLoginGET()).ServeHTTP, ) + s.router.Get( + "/signup", + auth(s.h.HandleSignupGET()).ServeHTTP, + ) + + s.router.Post( + "/signup", + auth(s.h.HandleSignupPOST()).ServeHTTP, + ) // route that panics for testing // CHANGEME remove this s.router.Get( @@ -89,7 +98,7 @@ func (s *Server) SetupRoutes() { // set up authenticated /metrics route: if viper.GetString("METRICS_USERNAME") != "" { s.router.Group(func(r chi.Router) { - r.Use(s.mw.MetricsAuthMiddleware()) + r.Use(s.mw.MetricsAuth()) r.Get("/metrics", http.HandlerFunc(promhttp.Handler().ServeHTTP)) }) } diff --git a/internal/server/server.go b/internal/server/server.go index e85801b..64e0ba6 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -64,7 +64,7 @@ func New(lc fx.Lifecycle, params ServerParams) (*Server, error) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { s.startupTime = time.Now() - s.Run() // background FIXME + go s.Run() // background FIXME return nil }, OnStop: func(ctx context.Context) error { diff --git a/templates/htmlfooter.html b/templates/htmlfooter.html new file mode 100644 index 0000000..2a60c59 --- /dev/null +++ b/templates/htmlfooter.html @@ -0,0 +1,3 @@ + + + diff --git a/templates/htmlheader.html b/templates/htmlheader.html new file mode 100644 index 0000000..2d3e82d --- /dev/null +++ b/templates/htmlheader.html @@ -0,0 +1,4 @@ + + {{ .HTMLTitle }} + + diff --git a/templates/index.html b/templates/index.html index 426c8ac..b038f44 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,84 +1,29 @@ - - Changeme: Go HTTP Server Boilerplate - - + {{ template "htmlheader.html" . }} - - + {{ template "navbar.html" .}}

Hello, world!

+

gohttpserver

This is a boilerplate application for you to use as a base for your own sites and services.

+

+ Find more info at https://git.eeqj.de/sneak/gohttpserver. +

+

+ This software is provided by @sneak + and is released unconditionally into the public domain. +

Learn more »

- - - - + {{ template "pagefooter.html" . }} + {{ template "htmlfooter.html" . }} diff --git a/templates/login.html b/templates/login.html index b8e654b..1b356c4 100644 --- a/templates/login.html +++ b/templates/login.html @@ -1,10 +1,7 @@ - - Changeme: Go HTTP Server Boilerplate - - + {{ template "htmlheader.html" . }} + + + + {{ template "navbar.html" .Navbar}} + +
+
+
+

Create New Account

+ +
+ Email: + +
+ +
+ Desired Username: + +
+
+

Please use a unique password that you don't use anywhere + else. Minimum 12 characters.

+ New Password: + +
+
+ New Password (again): + +
+
+ +
+ +
+

Create an Account

+
+ + +
+ + {{ template "pagefooter.html" .PageFooter }} + + diff --git a/templates/templates.go b/templates/templates.go index 43e93ee..0184d6a 100644 --- a/templates/templates.go +++ b/templates/templates.go @@ -2,12 +2,21 @@ package templates import ( "embed" - "strings" + "text/template" ) //go:embed *.html -var Templates embed.FS +var TemplatesRaw embed.FS +var TemplatesParsed *template.Template +func GetParsed() *template.Template { + if TemplatesParsed == nil { + TemplatesParsed = template.Must(template.ParseFS(TemplatesRaw, "*")) + } + return TemplatesParsed +} + +/* func MustString(filename string) string { bytes, error := Templates.ReadFile(filename) if error != nil { @@ -17,3 +26,4 @@ func MustString(filename string) string { out.Write(bytes) return out.String() } +*/