pink_fox/application/inner/middlewares/ErrorMiddleware.go

57 lines
1.4 KiB
Go

package middlewares
import (
"fmt"
"net/http"
"pink_fox/packages/fw"
"runtime/debug"
)
type ErrorMiddlewareServices interface {
Debug() bool
Logger() fw.Logger
ResponseFactory() *fw.ResponseFactory
}
func ErrorMiddleware(services ErrorMiddlewareServices, next fw.ActionFunc) (response fw.Response, err fw.Error) {
defer func() {
if err_ := recover(); err_ != nil {
err = fw.ErrPanic(fmt.Errorf("panic: %v", err_), debug.Stack())
err = errorsHandler(services.ResponseFactory(), err, services.Debug(), services.Logger())
response = nil
}
}()
response, err = next()
if err != nil {
err = errorsHandler(services.ResponseFactory(), err, services.Debug(), services.Logger())
return nil, err // ошибку отобразили
}
return nil, nil
}
func errorsHandler(responseFactory *fw.ResponseFactory, errIn fw.Error, debugOn bool, logger fw.Logger) fw.Error {
if logger != nil {
logger.Error(errIn.Message(), errIn.Trace())
}
textError := ""
if debugOn {
textError = errIn.Error()
}
response := responseFactory.View("errors/500.html", map[string]any{
"title": fmt.Sprintf("%d %s", http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)),
"message": "We have a problem",
"error": textError,
})
response.WriteHeader(http.StatusInternalServerError)
err := response.Render()
if err != nil {
return err.Add("ошибка при создании страницы ошибки")
}
return nil
}