commerce_api-8.x-1.x-dev/src/Plugin/jsonapi_hypermedia/LinkProvider/PaymentApproveLinkProvider.php
src/Plugin/jsonapi_hypermedia/LinkProvider/PaymentApproveLinkProvider.php
<?php
declare(strict_types=1);
namespace Drupal\commerce_api\Plugin\jsonapi_hypermedia\LinkProvider;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_payment\Entity\PaymentGatewayInterface;
use Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\OffsitePaymentGatewayInterface;
use Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\SupportsStoredPaymentMethodsInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Url;
use Drupal\jsonapi_hypermedia\AccessRestrictedLink;
/**
* Class PaymentGatewayOnReturnLinkProvider.
*
* @JsonapiHypermediaLinkProvider(
* id = "commerce_api.payment.approve",
* link_relation_type = "payment-approve",
* deriver = "\Drupal\commerce_api\Plugin\Derivative\OrderResourceTypeDeriver",
* )
*
* @internal
*/
final class PaymentApproveLinkProvider extends PaymentLinkProviderBase {
/**
* {@inheritdoc}
*/
public function doGetLink(OrderInterface $order, PaymentGatewayInterface $payment_gateway, CacheableMetadata $cacheable_metadata) {
$plugin = $payment_gateway->getPlugin();
// The Approve resource is for off-site and manual payments.
if (!$plugin instanceof OffsitePaymentGatewayInterface) {
return AccessRestrictedLink::createInaccessibleLink($cacheable_metadata);
}
// If the off-site payment gateway supports stored payment methods, do not
// provide this link. We only want the authorize and capture links to be
// returned.
if ($plugin instanceof SupportsStoredPaymentMethodsInterface && !$order->get('payment_method')->isEmpty()) {
return AccessRestrictedLink::createInaccessibleLink($cacheable_metadata);
}
return AccessRestrictedLink::createLink(
AccessResult::allowed(),
$cacheable_metadata,
new Url('commerce_api.checkout.payment_approve', [
'commerce_order' => $order->uuid(),
'payment_gateway' => $payment_gateway->uuid(),
]),
$this->getLinkRelationType()
);
}
}
