This commit is contained in:
64
internal/api/middleware/error.go
Normal file
64
internal/api/middleware/error.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
// "github.com/getsentry/sentry-go"
|
||||
"clintonambulance.com/calculate_negative_points/internal/utils"
|
||||
"github.com/swaggest/rest"
|
||||
"github.com/swaggest/rest/nethttp"
|
||||
)
|
||||
|
||||
func ErrorResponder(w http.ResponseWriter, error string, code int) {
|
||||
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||
w.Header().Set("X-Content-Type-Options", "nosniff")
|
||||
w.WriteHeader(code)
|
||||
_ = json.NewEncoder(w).Encode(utils.NewApplicationError(error, code))
|
||||
}
|
||||
|
||||
type errorWithFields interface {
|
||||
error
|
||||
Fields() map[string]interface{}
|
||||
}
|
||||
|
||||
// ErrorHandler middleware centralizes error handling and translation of errors between different error types
|
||||
func ErrorHandler(next http.Handler) http.Handler {
|
||||
var h *nethttp.Handler
|
||||
if nethttp.HandlerAs(next, &h) {
|
||||
resp := func(ctx context.Context, err error) (int, interface{}) {
|
||||
// Handle AWS errors
|
||||
|
||||
// Application-specific error handling: if this error has a marker interface, serialize it as JSON
|
||||
var customErr utils.CustomApplicationError
|
||||
if errors.As(err, &customErr) {
|
||||
return customErr.HTTPStatus(), customErr
|
||||
}
|
||||
|
||||
// More detailed validation error messages
|
||||
var validationErr errorWithFields
|
||||
if errors.As(err, &validationErr) {
|
||||
detailedErrorMessages := make([]string, len(validationErr.Fields()))
|
||||
i := 0
|
||||
for k, v := range validationErr.Fields() {
|
||||
detailedErrorMessages[i] = fmt.Sprintf("%s: %v", k, v)
|
||||
i++
|
||||
}
|
||||
return http.StatusUnprocessableEntity, utils.ApplicationError{
|
||||
Message: fmt.Sprintf("Validation errors: %s", strings.Join(detailedErrorMessages, ", ")),
|
||||
}
|
||||
}
|
||||
|
||||
code, er := rest.Err(err)
|
||||
return code, utils.ApplicationError{
|
||||
Message: er.ErrorText,
|
||||
}
|
||||
}
|
||||
h.MakeErrResp = resp
|
||||
}
|
||||
return next
|
||||
}
|
||||
Reference in New Issue
Block a user