saasitone/router/router.go
2021-12-03 08:06:06 -05:00

69 lines
1.8 KiB
Go

package router
import (
"net/http"
"github.com/gorilla/sessions"
"github.com/labstack/echo-contrib/session"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"goweb/container"
"goweb/controllers"
)
const StaticDir = "static"
func BuildRouter(c *container.Container) {
// Middleware
c.Web.Use(middleware.RemoveTrailingSlashWithConfig(middleware.TrailingSlashConfig{
RedirectCode: http.StatusMovedPermanently,
}))
c.Web.Use(middleware.RequestID())
c.Web.Use(middleware.Recover())
c.Web.Use(middleware.Gzip())
c.Web.Use(middleware.Logger())
// TODO: needs cache control headers
c.Web.Use(session.Middleware(sessions.NewCookieStore([]byte(c.Config.App.EncryptionKey))))
c.Web.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
TokenLookup: "form:csrf",
}))
// Static files with proper cache control
// funcmap.File() should be used in templates to append a cache key to the URL in order to break cache
// after each server restart
c.Web.Group("", func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
c.Response().Header().Set("Cache-Control", "public, max-age=15552000")
return next(c)
}
}).Static("/", StaticDir)
// Base controller
ctr := controllers.NewController(c)
// Error handler
err := controllers.Error{Controller: ctr}
c.Web.HTTPErrorHandler = err.Get
// Routes
navRoutes(c.Web, ctr)
userRoutes(c.Web, ctr)
}
func navRoutes(e *echo.Echo, ctr controllers.Controller) {
home := controllers.Home{Controller: ctr}
e.GET("/", home.Get).Name = "home"
about := controllers.About{Controller: ctr}
e.GET("/about", about.Get).Name = "about"
contact := controllers.Contact{Controller: ctr}
e.GET("/contact", contact.Get).Name = "contact"
e.POST("/contact", contact.Post).Name = "contact.post"
}
func userRoutes(e *echo.Echo, ctr controllers.Controller) {
// TODO
}