@@ -13,74 +13,78 @@ import (
1313
1414type ErrorHandler struct {}
1515
16+ func writeError (w http.ResponseWriter , r * http.Request , statusCode int , message string ) {
17+ render .Status (r , statusCode )
18+ render .JSON (w , r , types.ErrorResponse {
19+ Status : http .StatusText (statusCode ),
20+ Error : message ,
21+ })
22+ }
23+
1624func (e * ErrorHandler ) Wrap (handler func (w http.ResponseWriter , r * http.Request ) error ) http.HandlerFunc {
1725 return func (w http.ResponseWriter , r * http.Request ) {
1826 var notFoundError * serviceErrors.NotFound
1927 var badRequestError * serviceErrors.BadRequest
2028 var serviceUnavailable * serviceErrors.ServiceUnavailable
2129 var forbiddenError * serviceErrors.Forbidden
2230 var unauthorizedError * serviceErrors.Unauthorized
31+ var methodNotAllowedError * serviceErrors.MethodNotAllowed
32+ var conflictError * serviceErrors.Conflict
33+ var goneError * serviceErrors.Gone
34+ var unsupportedMediaTypeError * serviceErrors.UnsupportedMediaType
35+ var unprocessableEntityError * serviceErrors.UnprocessableEntity
36+ var tooManyRequestsError * serviceErrors.TooManyRequests
37+ var internalServerError * serviceErrors.InternalServerError
38+ var badGatewayError * serviceErrors.BadGateway
39+ var gatewayTimeoutError * serviceErrors.GatewayTimeout
40+ var requestTimeoutError * serviceErrors.RequestTimeout
41+ var notImplementedError * serviceErrors.NotImplemented
2342
2443 err := handler (w , r )
25-
26- if (errors .As (err , & notFoundError )) || (errors .Is (err , storage .ErrNotFound )) {
27- render .Status (r , http .StatusNotFound )
28- response := types.ErrorResponse {
29- Status : http .StatusText (http .StatusNotFound ),
30- Error : err .Error (),
31- }
32- render .JSON (w , r , response )
33- return
34- }
35-
36- if errors .As (err , & badRequestError ) {
37- render .Status (r , http .StatusBadRequest )
38- response := types.ErrorResponse {
39- Status : http .StatusText (http .StatusBadRequest ),
40- Error : err .Error (),
41- }
42- render .JSON (w , r , response )
43- return
44- }
45-
46- if errors .As (err , & serviceUnavailable ) {
47- render .Status (r , http .StatusServiceUnavailable )
48- response := types.ErrorResponse {
49- Status : http .StatusText (http .StatusServiceUnavailable ),
50- Error : err .Error (),
51- }
52- render .JSON (w , r , response )
44+ if err == nil {
5345 return
5446 }
5547
56- if errors .As (err , & forbiddenError ) {
57- render .Status (r , http .StatusForbidden )
58- response := types.ErrorResponse {
59- Status : http .StatusText (http .StatusForbidden ),
60- Error : err .Error (),
61- }
62- render .JSON (w , r , response )
63- return
64- }
48+ statusCode := http .StatusInternalServerError
49+ responseError := err .Error ()
6550
66- if errors .As (err , & unauthorizedError ) {
67- render .Status (r , http .StatusUnauthorized )
68- response := types.ErrorResponse {
69- Status : http .StatusText (http .StatusUnauthorized ),
70- Error : err .Error (),
71- }
72- render .JSON (w , r , response )
73- return
51+ switch {
52+ case errors .As (err , & notFoundError ), errors .Is (err , storage .ErrNotFound ):
53+ statusCode = http .StatusNotFound
54+ case errors .As (err , & badRequestError ):
55+ statusCode = http .StatusBadRequest
56+ case errors .As (err , & serviceUnavailable ):
57+ statusCode = http .StatusServiceUnavailable
58+ case errors .As (err , & forbiddenError ):
59+ statusCode = http .StatusForbidden
60+ case errors .As (err , & unauthorizedError ):
61+ statusCode = http .StatusUnauthorized
62+ case errors .As (err , & methodNotAllowedError ):
63+ statusCode = http .StatusMethodNotAllowed
64+ case errors .As (err , & conflictError ):
65+ statusCode = http .StatusConflict
66+ case errors .As (err , & goneError ):
67+ statusCode = http .StatusGone
68+ case errors .As (err , & unsupportedMediaTypeError ):
69+ statusCode = http .StatusUnsupportedMediaType
70+ case errors .As (err , & unprocessableEntityError ):
71+ statusCode = http .StatusUnprocessableEntity
72+ case errors .As (err , & tooManyRequestsError ):
73+ statusCode = http .StatusTooManyRequests
74+ case errors .As (err , & internalServerError ):
75+ statusCode = http .StatusInternalServerError
76+ case errors .As (err , & badGatewayError ):
77+ statusCode = http .StatusBadGateway
78+ case errors .As (err , & gatewayTimeoutError ):
79+ statusCode = http .StatusGatewayTimeout
80+ case errors .As (err , & requestTimeoutError ):
81+ statusCode = http .StatusRequestTimeout
82+ case errors .As (err , & notImplementedError ):
83+ statusCode = http .StatusNotImplemented
84+ default :
85+ responseError = "encountered an unexpected server error: " + err .Error ()
7486 }
7587
76- if err != nil {
77- render .Status (r , http .StatusInternalServerError )
78- response := types.ErrorResponse {
79- Status : http .StatusText (http .StatusInternalServerError ),
80- Error : "encountered an unexpected server error: " + err .Error (),
81- }
82- render .JSON (w , r , response )
83- return
84- }
88+ writeError (w , r , statusCode , responseError )
8589 }
8690}
0 commit comments