73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package server
|
|
|
|
import (
|
|
"bytes"
|
|
"database/sql"
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
|
|
"github.com/ekzyis/echo-htmx-templ-tailwindcss/pages"
|
|
)
|
|
|
|
type Server struct {
|
|
*echo.Echo
|
|
}
|
|
|
|
func New(sCtx Context) *Server {
|
|
var (
|
|
e *echo.Echo
|
|
s *Server
|
|
)
|
|
e = echo.New()
|
|
|
|
e.Static("/", "public")
|
|
|
|
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
|
|
Format: "${time_custom} ${method} ${uri} ${status}\n",
|
|
CustomTimeFormat: "2006-01-02 15:04:05.00000-0700",
|
|
}))
|
|
|
|
e.HTTPErrorHandler = httpErrorHandler(sCtx)
|
|
|
|
s = &Server{e}
|
|
|
|
s.GET("/", index(sCtx))
|
|
|
|
return s
|
|
}
|
|
|
|
func httpErrorHandler(sCtx Context) echo.HTTPErrorHandler {
|
|
return func(err error, eCtx echo.Context) {
|
|
var (
|
|
code = http.StatusInternalServerError
|
|
page = pages.Error
|
|
buf *bytes.Buffer
|
|
)
|
|
|
|
eCtx.Logger().Error(err)
|
|
|
|
if err == sql.ErrNoRows {
|
|
code = http.StatusNotFound
|
|
}
|
|
|
|
if httpError, ok := err.(*echo.HTTPError); ok {
|
|
code = httpError.Code
|
|
}
|
|
|
|
// make sure that HTMX selects and targets correct element
|
|
eCtx.Response().Header().Add("HX-Retarget", "#content")
|
|
eCtx.Response().Header().Add("HX-Reselect", "#content")
|
|
|
|
if err = pages.Render(page(code), code, eCtx); err != nil {
|
|
eCtx.Logger().Error(err)
|
|
code = http.StatusInternalServerError
|
|
}
|
|
|
|
if err = eCtx.HTML(code, buf.String()); err != nil {
|
|
eCtx.Logger().Error(err)
|
|
}
|
|
}
|
|
}
|