1: <?php
2: /*
3: * This class was auto-generated from the API references found at
4: * https://apireference.connect.worldline-solutions.com/
5: */
6: namespace Worldline\Connect\Sdk\V1;
7:
8: use Worldline\Connect\Sdk\CallContext;
9: use Worldline\Connect\Sdk\Domain\DataObject;
10: use Worldline\Connect\Sdk\V1\Domain\APIError;
11: use Worldline\Connect\Sdk\V1\Domain\PaymentErrorResponse;
12: use Worldline\Connect\Sdk\V1\Domain\PayoutErrorResponse;
13: use Worldline\Connect\Sdk\V1\Domain\RefundErrorResponse;
14:
15: /**
16: * Class ExceptionFactory
17: *
18: * @package Worldline\Connect\Sdk\V1
19: */
20: class ExceptionFactory
21: {
22: const IDEMPOTENCE_ERROR_CODE = '1409';
23:
24: /**
25: * @param int $httpStatusCode
26: * @param DataObject $errorObject
27: * @param CallContext $callContext
28: * @return ResponseException
29: */
30: public function createException(
31: $httpStatusCode,
32: DataObject $errorObject,
33: CallContext $callContext = null
34: ) {
35: if ($errorObject instanceof PaymentErrorResponse && !is_null($errorObject->paymentResult)) {
36: return new DeclinedPaymentException($httpStatusCode, $errorObject);
37: }
38: if ($errorObject instanceof PayoutErrorResponse && !is_null($errorObject->payoutResult)) {
39: return new DeclinedPayoutException($httpStatusCode, $errorObject);
40: }
41: if ($errorObject instanceof RefundErrorResponse && !is_null($errorObject->refundResult)) {
42: return new DeclinedRefundException($httpStatusCode, $errorObject);
43: }
44: if ($httpStatusCode === 400) {
45: return new ValidationException($httpStatusCode, $errorObject);
46: }
47: if ($httpStatusCode === 403) {
48: return new AuthorizationException($httpStatusCode, $errorObject);
49: }
50: if ($httpStatusCode === 404) {
51: return new ReferenceException($httpStatusCode, $errorObject);
52: }
53: if ($httpStatusCode === 409) {
54: if ($callContext && strlen($callContext->getIdempotenceKey()) > 0 &&
55: $this->isIdempotenceError($errorObject)
56: ) {
57: return new IdempotenceException(
58: $httpStatusCode,
59: $errorObject,
60: null,
61: $callContext->getIdempotenceKey(),
62: $callContext->getIdempotenceRequestTimestamp()
63: );
64: }
65: return new ReferenceException($httpStatusCode, $errorObject);
66: }
67: if ($httpStatusCode === 410) {
68: return new ReferenceException($httpStatusCode, $errorObject);
69: }
70: if ($httpStatusCode === 500) {
71: return new PlatformException($httpStatusCode, $errorObject);
72: }
73: if ($httpStatusCode === 502) {
74: return new PlatformException($httpStatusCode, $errorObject);
75: }
76: if ($httpStatusCode === 503) {
77: return new PlatformException($httpStatusCode, $errorObject);
78: }
79: return new ApiException($httpStatusCode, $errorObject);
80: }
81:
82: /**
83: * @param DataObject $errorObject
84: * @return bool
85: */
86: protected function isIdempotenceError(DataObject $errorObject)
87: {
88: $errorObjectVariables = get_object_vars($errorObject);
89: if (!array_key_exists('errors', $errorObjectVariables)) {
90: return false;
91: }
92: $errors = $errorObjectVariables['errors'];
93: return is_array($errors)
94: && count($errors) === 1
95: && $errors[0] instanceof APIError
96: && $errors[0]->code == static::IDEMPOTENCE_ERROR_CODE;
97: }
98: }
99: