From 45db5abb34422dc25b656bcc975742fb1455bde0 Mon Sep 17 00:00:00 2001
From: Philipp Stracker
Date: Tue, 17 Dec 2024 19:35:43 +0100
Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Use=20new=20connection=20m?=
=?UTF-8?q?anager=20in=20REST=20endpoint?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
modules/ppcp-settings/services.php | 5 +-
.../Endpoint/ConnectManualRestEndpoint.php | 161 +++---------------
2 files changed, 24 insertions(+), 142 deletions(-)
diff --git a/modules/ppcp-settings/services.php b/modules/ppcp-settings/services.php
index 1397b137b..6b676850d 100644
--- a/modules/ppcp-settings/services.php
+++ b/modules/ppcp-settings/services.php
@@ -81,10 +81,7 @@ return array(
},
'settings.rest.connect_manual' => static function ( ContainerInterface $container ) : ConnectManualRestEndpoint {
return new ConnectManualRestEndpoint(
- $container->get( 'api.paypal-host-production' ),
- $container->get( 'api.paypal-host-sandbox' ),
- $container->get( 'woocommerce.logger.woocommerce' ),
- $container->get( 'settings.data.general' )
+ $container->get( 'settings.service.connection_manager' ),
);
},
'settings.rest.login_link' => static function ( ContainerInterface $container ) : LoginLinkRestEndpoint {
diff --git a/modules/ppcp-settings/src/Endpoint/ConnectManualRestEndpoint.php b/modules/ppcp-settings/src/Endpoint/ConnectManualRestEndpoint.php
index 7046342a2..efeda393d 100644
--- a/modules/ppcp-settings/src/Endpoint/ConnectManualRestEndpoint.php
+++ b/modules/ppcp-settings/src/Endpoint/ConnectManualRestEndpoint.php
@@ -20,33 +20,12 @@ use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\Orders;
use WooCommerce\PayPalCommerce\ApiClient\Helper\InMemoryCache;
use WooCommerce\PayPalCommerce\Settings\Data\GeneralSettings;
+use WooCommerce\PayPalCommerce\Settings\Service\ConnectionManager;
/**
* REST controller for connection via manual credentials input.
*/
class ConnectManualRestEndpoint extends RestEndpoint {
-
- /**
- * The API host for the live mode.
- *
- * @var string
- */
- private string $live_host;
-
- /**
- * The API host for the sandbox mode.
- *
- * @var string
- */
- private string $sandbox_host;
-
- /**
- * The logger.
- *
- * @var LoggerInterface
- */
- private $logger;
-
/**
* The base path for this REST controller.
*
@@ -54,13 +33,6 @@ class ConnectManualRestEndpoint extends RestEndpoint {
*/
protected $rest_base = 'connect_manual';
- /**
- * Settings instance.
- *
- * @var GeneralSettings
- */
- private $settings = null;
-
/**
* Field mapping for request.
*
@@ -81,24 +53,27 @@ class ConnectManualRestEndpoint extends RestEndpoint {
),
);
+ /**
+ * Defines the JSON response format (when connection was successful).
+ *
+ * @var array
+ */
+ private array $response_map = array(
+ 'merchant_id' => array(
+ 'js_name' => 'merchantId',
+ ),
+ 'merchant_email' => array(
+ 'js_name' => 'email',
+ ),
+ );
+
/**
* ConnectManualRestEndpoint constructor.
*
- * @param string $live_host The API host for the live mode.
- * @param string $sandbox_host The API host for the sandbox mode.
- * @param LoggerInterface $logger The logger.
- * @param GeneralSettings $settings Settings instance.
+ * @param ConnectionManager $connection_manager The connection manager.
*/
- public function __construct(
- string $live_host,
- string $sandbox_host,
- LoggerInterface $logger,
- GeneralSettings $settings
- ) {
- $this->live_host = $live_host;
- $this->sandbox_host = $sandbox_host;
- $this->logger = $logger;
- $this->settings = $settings;
+ public function __construct( ConnectionManager $connection_manager ) {
+ $this->connection_manager = $connection_manager;
}
/**
@@ -133,106 +108,16 @@ class ConnectManualRestEndpoint extends RestEndpoint {
$client_secret = $data['client_secret'] ?? '';
$use_sandbox = (bool) ( $data['use_sandbox'] ?? false );
- if ( empty( $client_id ) || empty( $client_secret ) ) {
- return $this->return_error( 'No client ID or secret provided.' );
- }
-
try {
- $payee = $this->request_payee( $client_id, $client_secret, $use_sandbox );
+ $this->connection_manager->validate_id_and_secret( $client_id, $client_secret );
+ $this->connection_manager->connect_via_secret( $use_sandbox, $client_id, $client_secret );
} catch ( Exception $exception ) {
return $this->return_error( $exception->getMessage() );
}
- if ( $use_sandbox ) {
- $this->settings->set_is_sandbox( true );
- $this->settings->set_sandbox_client_id( $client_id );
- $this->settings->set_sandbox_client_secret( $client_secret );
- $this->settings->set_sandbox_merchant_id( $payee->merchant_id );
- $this->settings->set_sandbox_merchant_email( $payee->email_address );
- } else {
- $this->settings->set_is_sandbox( false );
- $this->settings->set_live_client_id( $client_id );
- $this->settings->set_live_client_secret( $client_secret );
- $this->settings->set_live_merchant_id( $payee->merchant_id );
- $this->settings->set_live_merchant_email( $payee->email_address );
- }
- $this->settings->save();
+ $account = $this->connection_manager->get_account_details();
+ $response = $this->sanitize_for_javascript( $this->response_map, $account );
- return $this->return_success(
- array(
- 'merchantId' => $payee->merchant_id,
- 'email' => $payee->email_address,
- )
- );
- }
-
- /**
- * Retrieves the payee object with the merchant data
- * by creating a minimal PayPal order.
- *
- * @throws Exception When failed to retrieve payee.
- *
- * phpcs:disable Squiz.Commenting
- * phpcs:disable Generic.Commenting
- *
- * @param string $client_secret The client secret.
- * @param bool $use_sandbox Whether to use the sandbox mode.
- * @param string $client_id The client ID.
- *
- * @return stdClass The payee object.
- */
- private function request_payee(
- string $client_id,
- string $client_secret,
- bool $use_sandbox
- ) : stdClass {
-
- $host = $use_sandbox ? $this->sandbox_host : $this->live_host;
-
- $bearer = new PayPalBearer(
- new InMemoryCache(),
- $host,
- $client_id,
- $client_secret,
- $this->logger,
- null
- );
-
- $orders = new Orders(
- $host,
- $bearer,
- $this->logger
- );
-
- $request_body = array(
- 'intent' => 'CAPTURE',
- 'purchase_units' => array(
- array(
- 'amount' => array(
- 'currency_code' => 'USD',
- 'value' => 1.0,
- ),
- ),
- ),
- );
-
- $response = $orders->create( $request_body );
- $body = json_decode( $response['body'] );
-
- $order_id = $body->id;
-
- $order_response = $orders->order( $order_id );
- $order_body = json_decode( $order_response['body'] );
-
- $pu = $order_body->purchase_units[0];
- $payee = $pu->payee;
- if ( ! is_object( $payee ) ) {
- throw new RuntimeException( 'Payee not found.' );
- }
- if ( ! isset( $payee->merchant_id ) || ! isset( $payee->email_address ) ) {
- throw new RuntimeException( 'Payee info not found.' );
- }
-
- return $payee;
+ return $this->return_success( $response );
}
}