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