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  }