<?php
/**
* The endpoint for validating the checkout form.
*
* @package WooCommerce\PayPalCommerce\Button\Endpoint
*/
declare (strict_types=1);
namespace WooCommerce\PayPalCommerce\Button\Endpoint;
use WooCommerce\PayPalCommerce\Vendor\Psr\Log\LoggerInterface;
use Throwable;
use WooCommerce\PayPalCommerce\Button\Exception\NonceValidationException;
use WooCommerce\PayPalCommerce\Button\Exception\ValidationException;
use WooCommerce\PayPalCommerce\Button\Validation\CheckoutFormValidator;
/**
* Class ValidateCheckoutEndpoint.
*/
class ValidateCheckoutEndpoint implements \WooCommerce\PayPalCommerce\Button\Endpoint\EndpointInterface
{
const ENDPOINT = 'ppc-validate-checkout';
/**
* The Request Data Helper.
*
* @var RequestData
*/
private $request_data;
/**
* The CheckoutFormValidator.
*
* @var CheckoutFormValidator
*/
private $checkout_form_validator;
/**
* The logger.
*
* @var LoggerInterface
*/
private $logger;
/**
* ValidateCheckoutEndpoint constructor.
*
* @param RequestData $request_data The Request Data Helper.
* @param CheckoutFormValidator $checkout_form_validator The CheckoutFormValidator.
* @param LoggerInterface $logger The logger.
*/
public function __construct(\WooCommerce\PayPalCommerce\Button\Endpoint\RequestData $request_data, CheckoutFormValidator $checkout_form_validator, LoggerInterface $logger)
{
$this->request_data = $request_data;
$this->checkout_form_validator = $checkout_form_validator;
$this->logger = $logger;
}
/**
* Returns the nonce.
*
* @return string
*/
public static function nonce(): string
{
return self::ENDPOINT;
}
/**
* Handles the request.
*/
public function handle_request(): void
{
try {
$data = $this->request_data->read_request($this->nonce());
$form_fields = $data['form'];
$this->checkout_form_validator->validate($form_fields);
wp_send_json_success();
} catch (NonceValidationException $error) {
wp_send_json_error(array('message' => $error->getMessage()), 400);
} catch (ValidationException $exception) {
$response = array('message' => $exception->getMessage(), 'errors' => $exception->errors(), 'refresh' => isset(WC()->session->refresh_totals));
unset(WC()->session->refresh_totals);
wp_send_json_error($response);
} catch (Throwable $error) {
$this->logger->error("Form validation execution failed. {$error->getMessage()} {$error->getFile()}:{$error->getLine()}");
wp_send_json_error(array('message' => $error->getMessage()));
}
}
}