43 lines
862 B
Go
43 lines
862 B
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/mikestefanello/pagoda/pkg/context"
|
|
"github.com/mikestefanello/pagoda/pkg/log"
|
|
"github.com/mikestefanello/pagoda/pkg/ui/pages"
|
|
)
|
|
|
|
type Error struct{}
|
|
|
|
func (e *Error) Page(err error, ctx echo.Context) {
|
|
if ctx.Response().Committed || context.IsCanceledError(err) {
|
|
return
|
|
}
|
|
|
|
// Determine the error status code.
|
|
code := http.StatusInternalServerError
|
|
if he, ok := err.(*echo.HTTPError); ok {
|
|
code = he.Code
|
|
}
|
|
|
|
// Log the error.
|
|
logger := log.Ctx(ctx)
|
|
switch {
|
|
case code >= 500:
|
|
logger.Error(err.Error())
|
|
case code >= 400:
|
|
logger.Warn(err.Error())
|
|
}
|
|
|
|
// Set the status code.
|
|
ctx.Response().Status = code
|
|
|
|
// Render the error page.
|
|
if err = pages.Error(ctx, code); err != nil {
|
|
log.Ctx(ctx).Error("failed to render error page",
|
|
"error", err,
|
|
)
|
|
}
|
|
}
|