github.com/Ingenico-ePayments/connect-sdk-go@v0.0.0-20240318153750-1f8cd329b9c9/errors/CreateAPIError.go (about) 1 package errors 2 3 import ( 4 "net/http" 5 6 "github.com/Ingenico-ePayments/connect-sdk-go/communicator/communication" 7 apiErrors "github.com/Ingenico-ePayments/connect-sdk-go/domain/errors" 8 "github.com/Ingenico-ePayments/connect-sdk-go/domain/payment" 9 "github.com/Ingenico-ePayments/connect-sdk-go/domain/payout" 10 "github.com/Ingenico-ePayments/connect-sdk-go/domain/refund" 11 ) 12 13 // CreateAPIError is used internally in order to create an API error after an HTTP request is done 14 func CreateAPIError(statusCode int, responseBody string, errorObject interface{}, context communication.CallContext) (APIError, error) { 15 var errorID string 16 var errors []apiErrors.APIError 17 18 switch response := errorObject.(type) { 19 case *payment.ErrorResponse: 20 { 21 paymentResult := response.PaymentResult 22 23 if paymentResult != nil { 24 return NewDeclinedPaymentError(statusCode, responseBody, response) 25 } 26 27 if response.ErrorID != nil { 28 errorID = *response.ErrorID 29 } 30 if response.Errors != nil { 31 errors = *response.Errors 32 } 33 break 34 } 35 case *payout.ErrorResponse: 36 { 37 payoutResult := response.PayoutResult 38 39 if payoutResult != nil { 40 return NewDeclinedPayoutError(statusCode, responseBody, response) 41 } 42 43 if response.ErrorID != nil { 44 errorID = *response.ErrorID 45 } 46 if response.Errors != nil { 47 errors = *response.Errors 48 } 49 50 break 51 } 52 case *refund.ErrorResponse: 53 { 54 refundResult := response.RefundResult 55 56 if refundResult != nil { 57 return NewDeclinedRefundError(statusCode, responseBody, response) 58 } 59 60 if response.ErrorID != nil { 61 errorID = *response.ErrorID 62 } 63 if response.Errors != nil { 64 errors = *response.Errors 65 } 66 67 break 68 } 69 case *apiErrors.ErrorResponse: 70 { 71 if response.ErrorID != nil { 72 errorID = *response.ErrorID 73 } 74 if response.Errors != nil { 75 errors = *response.Errors 76 } 77 78 break 79 } 80 } 81 82 switch statusCode { 83 case http.StatusBadRequest: 84 { 85 return NewValidateError(statusCode, responseBody, errorID, errors) 86 } 87 case http.StatusForbidden: 88 { 89 return NewAuthorizationError(statusCode, responseBody, errorID, errors) 90 } 91 case http.StatusNotFound: 92 { 93 return NewReferenceError(statusCode, responseBody, errorID, errors) 94 } 95 case http.StatusConflict: 96 { 97 if isIdempotenceError(errors, context) { 98 idempotenceKey := context.GetIdempotenceKey() 99 idempotenceTimeStamp := context.GetIdempotenceRequestTimestamp() 100 101 return NewIdempotenceError(idempotenceKey, idempotenceTimeStamp, statusCode, responseBody, errorID, errors) 102 } 103 104 return NewReferenceError(statusCode, responseBody, errorID, errors) 105 } 106 case http.StatusGone: 107 { 108 return NewReferenceError(statusCode, responseBody, errorID, errors) 109 } 110 case http.StatusInternalServerError: 111 fallthrough 112 case http.StatusBadGateway: 113 fallthrough 114 case http.StatusServiceUnavailable: 115 fallthrough 116 default: 117 { 118 return NewGlobalCollectError(statusCode, responseBody, errorID, errors) 119 } 120 } 121 } 122 123 func isIdempotenceError(errors []apiErrors.APIError, context communication.CallContext) (ok bool) { 124 ok = context != nil && len(context.GetIdempotenceKey()) != 0 && len(errors) == 1 && errors[0].Code != nil && *errors[0].Code == "1409" 125 126 return 127 }