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 }