jenkins-bot has submitted this change and it was merged.

Change subject: DRY finding OrderReferenceId, get_class() -> instanceOf
......................................................................


DRY finding OrderReferenceId, get_class() -> instanceOf

Refactor AmazonApi and AmazonMessage for less duplicated code
(in the future).

There are a lot of places we might want the order reference ID,
which is the first 19 characters of a the derived IDs. Also, the
client setup has to happen for any API calls, so make in an
instance variable. Finally, use instanceOf instead of get_class
for less brittleness.

Bug: T147973
Change-Id: Ia074b1d9a475f3dfed5b25d09d77a3fc23197228
---
M PaymentProviders/Amazon/Actions/AssociateRefundParent.php
M PaymentProviders/Amazon/Actions/CloseOrderReference.php
M PaymentProviders/Amazon/AmazonApi.php
M PaymentProviders/Amazon/ExpatriatedMessages/AmazonMessage.php
M PaymentProviders/Amazon/ExpatriatedMessages/PaymentCapture.php
M PaymentProviders/Amazon/Tests/phpunit/ApiTest.php
6 files changed, 87 insertions(+), 35 deletions(-)

Approvals:
  XenoRyet: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/PaymentProviders/Amazon/Actions/AssociateRefundParent.php 
b/PaymentProviders/Amazon/Actions/AssociateRefundParent.php
index 094ca66..9f790d0 100644
--- a/PaymentProviders/Amazon/Actions/AssociateRefundParent.php
+++ b/PaymentProviders/Amazon/Actions/AssociateRefundParent.php
@@ -5,22 +5,23 @@
 use SmashPig\Core\Messages\ListenerMessage;
 use SmashPig\Core\SmashPigException;
 use SmashPig\PaymentProviders\Amazon\AmazonApi;
+use SmashPig\PaymentProviders\Amazon\ExpatriatedMessages\RefundCompleted;
 
 /**
  * Associate refunds with their parent contribution
  */
 class AssociateRefundParent implements IListenerMessageAction {
-       const MESSAGE_CLASS = 
'SmashPig\PaymentProviders\Amazon\ExpatriatedMessages\RefundCompleted';
 
        public function execute( ListenerMessage $msg ) {
                // Bail out if not a refund
-               if ( get_class( $msg ) !== self::MESSAGE_CLASS ) {
+               if ( !( $msg instanceof RefundCompleted ) ) {
                        return true;
                }
-               $refundId = $msg->getGatewayTransactionId();
-               Logger::info( "Looking up ID of original transaction for refund 
$refundId" );
+
+               $orderReferenceId = $msg->getOrderReferenceId();
+               Logger::info( "Looking up capture ID for order reference 
$orderReferenceId" );
                try {
-                       $parentId = AmazonApi::findRefundParentId( $refundId );
+                       $parentId = AmazonApi::get()->findCaptureId( 
$orderReferenceId );
                        $msg->setParentId( $parentId );
                        return true;
                } catch ( SmashPigException $ex ) {
diff --git a/PaymentProviders/Amazon/Actions/CloseOrderReference.php 
b/PaymentProviders/Amazon/Actions/CloseOrderReference.php
index 34acd0e..3a1f1bb 100644
--- a/PaymentProviders/Amazon/Actions/CloseOrderReference.php
+++ b/PaymentProviders/Amazon/Actions/CloseOrderReference.php
@@ -4,21 +4,20 @@
 use SmashPig\Core\Context;
 use SmashPig\Core\Logging\Logger;
 use SmashPig\Core\Messages\ListenerMessage;
+use SmashPig\PaymentProviders\Amazon\ExpatriatedMessages\CaptureCompleted;
 
 class CloseOrderReference implements IListenerMessageAction {
-       const MESSAGE_CLASS = 
'SmashPig\PaymentProviders\Amazon\ExpatriatedMessages\CaptureCompleted';
 
        public function execute( ListenerMessage $msg ) {
                // only close after successful capture
-               if ( get_class( $msg ) !== self::MESSAGE_CLASS ) {
+               if ( !( $msg instanceof CaptureCompleted ) ) {
                        return true;
                }
 
                $config = Context::get()->getConfiguration();
                $client = $config->object( 'payments-client', true );
 
-               $captureId = $msg->getGatewayTransactionId();
-               $orderReferenceId = substr( $captureId, 0, 19 );
+               $orderReferenceId = $msg->getOrderReferenceId();
 
                Logger::info( "Closing order reference $orderReferenceId" );
                $response = $client->closeOrderReference( array(
@@ -27,7 +26,7 @@
 
                if ( !empty( $response['Error'] ) ) {
                        Logger::info(
-                               "Error losing order reference 
$orderReferenceId: " .
+                               "Error closing order reference 
$orderReferenceId: " .
                                $response['Error']['Code'] . ': ' .
                                $response['Error']['Message']
                        );
diff --git a/PaymentProviders/Amazon/AmazonApi.php 
b/PaymentProviders/Amazon/AmazonApi.php
index d02fc51..530fb0d 100644
--- a/PaymentProviders/Amazon/AmazonApi.php
+++ b/PaymentProviders/Amazon/AmazonApi.php
@@ -1,6 +1,7 @@
 <?php namespace SmashPig\PaymentProviders\Amazon;
 
 use PayWithAmazon\IpnHandlerInterface;
+use PayWithAmazon\PaymentsClientInterface;
 use SmashPig\Core\Context;
 use SmashPig\Core\SmashPigException;
 
@@ -10,8 +11,30 @@
 class AmazonApi {
 
        /**
-        * @param $headers
-        * @param $body
+        * @var PaymentsClientInterface
+        */
+       protected $client;
+
+       /**
+        * @var AmazonApi
+        */
+       protected static $instance;
+
+       private function __construct() {
+               $config = Context::get()->getConfiguration();
+               $this->client = $config->object( 'payments-client', true );
+       }
+
+       public static function get() {
+               if ( !self::$instance ) {
+                       self::$instance = new self();
+               }
+               return self::$instance;
+       }
+
+       /**
+        * @param array $headers Associative array of HTTP headers
+        * @param string $body HTTP request body (should be JSON-encoded)
         * @return IpnHandlerInterface
         */
        public static function createIpnHandler( $headers, $body ) {
@@ -20,24 +43,18 @@
                return new $klass( $headers, $body );
        }
 
-       public static function findRefundParentId( $refundId ) {
-               $config = Context::get()->getConfiguration();
-               $client = $config->object( 'payments-client', true );
-
-               // The order reference ID is the first 19 characters of the 
refund ID
-               $orderReferenceId = substr( $refundId, 0, 19 );
-
-               $getDetailsResult = $client->getOrderReferenceDetails( array(
-                       'amazon_order_reference_id' => $orderReferenceId,
-               ) )->toArray();
-               if ( !empty( $getDetailsResult['Error'] ) ) {
-                       throw new SmashPigException( 
$getDetailsResult['Error']['Message'] );
-               }
-
+       /**
+        * @param string $orderReferenceId
+        * @return string Amazon's ID for the first successful capture 
associated
+        *  with this order reference
+        * @throws SmashPigException
+        */
+       public function findCaptureId( $orderReferenceId ) {
                // The order reference details should contain an IdList with 
all of the
                // authorizations that have been made against the order 
reference.  We
                // should only ever have one authorization per order reference.
-               $details = 
$getDetailsResult['GetOrderReferenceDetailsResult']['OrderReferenceDetails'];
+               $details = $this->getOrderReferenceDetails( $orderReferenceId );
+
                if ( !isset( $details['IdList'] ) || !isset( 
$details['IdList']['member'] ) ) {
                        throw new SmashPigException(
                                "No authorizations found for order reference 
$orderReferenceId!"
@@ -46,7 +63,7 @@
                $authorizationIds = (array) $details['IdList']['member'];
                // Check the status of each authorization against the order 
reference
                foreach ( $authorizationIds as $id ) {
-                       $authResult = $client->getAuthorizationDetails( array(
+                       $authResult = $this->client->getAuthorizationDetails( 
array(
                                'amazon_authorization_id' => $id,
                        ) )->toArray();
                        if ( !empty( $authResult['Error'] ) ) {
@@ -68,4 +85,22 @@
                        "No successful authorizations found for order reference 
$orderReferenceId!"
                );
        }
+
+       /**
+        * @param string $orderReferenceId 19 character Amazon order ID
+        * @return array OrderReferenceDetails as an associative array
+        *  @see 
https://payments.amazon.com/documentation/apireference/201752660
+        * @throws SmashPigException
+        */
+       protected function getOrderReferenceDetails( $orderReferenceId ) {
+               $getDetailsResult = $this->client->getOrderReferenceDetails(
+                       array(
+                               'amazon_order_reference_id' => 
$orderReferenceId,
+                       )
+               )->toArray();
+               if ( !empty( $getDetailsResult['Error'] ) ) {
+                       throw new SmashPigException( 
$getDetailsResult['Error']['Message'] );
+               }
+               return 
$getDetailsResult['GetOrderReferenceDetailsResult']['OrderReferenceDetails'];
+       }
 }
diff --git a/PaymentProviders/Amazon/ExpatriatedMessages/AmazonMessage.php 
b/PaymentProviders/Amazon/ExpatriatedMessages/AmazonMessage.php
index 7a4abff..d07d987 100644
--- a/PaymentProviders/Amazon/ExpatriatedMessages/AmazonMessage.php
+++ b/PaymentProviders/Amazon/ExpatriatedMessages/AmazonMessage.php
@@ -41,7 +41,7 @@
                $this->correlationId = 'amazon-' . $this->gateway_txn_id;
        }
 
-       public function getGatewayTransactionId() {
-               return $this->gateway_txn_id;
+       public function getOrderReferenceId() {
+               return substr( $this->gateway_txn_id, 0, 19);
        }
 }
diff --git a/PaymentProviders/Amazon/ExpatriatedMessages/PaymentCapture.php 
b/PaymentProviders/Amazon/ExpatriatedMessages/PaymentCapture.php
index a0f6c41..bda3953 100644
--- a/PaymentProviders/Amazon/ExpatriatedMessages/PaymentCapture.php
+++ b/PaymentProviders/Amazon/ExpatriatedMessages/PaymentCapture.php
@@ -21,11 +21,8 @@
                $this->setGatewayIds( $details['AmazonCaptureId'] );
 
                $captureReferenceId = $details['CaptureReferenceId'];
-               $this->completion_message_id = "amazon-$captureReferenceId";
-               $this->order_id = $captureReferenceId;
 
-               $parts = explode( '-', $captureReferenceId );
-               $this->contribution_tracking_id = $parts[0];
+               $this->setOrderId( $captureReferenceId );
 
                $this->date = UtcDate::getUtcTimestamp( 
$details['CreationTimestamp'] );
 
@@ -51,4 +48,24 @@
 
                return $queueMsg;
        }
+
+       /**
+        * Set fields derived from the order ID
+        *
+        * @param string $orderId
+        */
+       public function setOrderId( $orderId ) {
+               $this->order_id = $orderId;
+               $this->completion_message_id = "amazon-$orderId";
+
+               $parts = explode( '-', $orderId );
+               $this->contribution_tracking_id = $parts[0];
+       }
+
+       /**
+        * @return string
+        */
+       public function getOrderId() {
+               return $this->order_id;
+       }
 }
diff --git a/PaymentProviders/Amazon/Tests/phpunit/ApiTest.php 
b/PaymentProviders/Amazon/Tests/phpunit/ApiTest.php
index ecbefb9..ddb5387 100644
--- a/PaymentProviders/Amazon/Tests/phpunit/ApiTest.php
+++ b/PaymentProviders/Amazon/Tests/phpunit/ApiTest.php
@@ -23,7 +23,7 @@
        public function testFindParent() {
                $this->mockClient->returns['getAuthorizationDetails'][] = 
'Declined';
                $this->mockClient->returns['getAuthorizationDetails'][] = 
'Closed';
-               $parentId = AmazonApi::findRefundParentId( 
'P01-0133129-0199515-R019658' );
+               $parentId = AmazonApi::get()->findCaptureId( 
'P01-0133129-0199515' );
                $this->assertEquals( 'P01-0133129-0199515-C019658', $parentId, 
'Did not get the right refund parent ID' );
        }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/320833
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia074b1d9a475f3dfed5b25d09d77a3fc23197228
Gerrit-PatchSet: 4
Gerrit-Project: wikimedia/fundraising/SmashPig
Gerrit-Branch: master
Gerrit-Owner: Ejegg <eeggles...@wikimedia.org>
Gerrit-Reviewer: Awight <awi...@wikimedia.org>
Gerrit-Reviewer: Cdentinger <cdentin...@wikimedia.org>
Gerrit-Reviewer: XenoRyet <dkozlow...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to