Files
2025-11-24 21:33:55 +00:00

265 lines
7.0 KiB
PHP

<?php
/**
* Class RestController
*
* @package WooCommerce\Payments\MultiCurrency
*/
namespace WCPay\MultiCurrency;
use Exception;
use WCPay\MultiCurrency\Exceptions\InvalidCurrencyException;
use WCPay\MultiCurrency\MultiCurrency;
defined( 'ABSPATH' ) || exit;
/**
* REST controller for multi-currency.
*/
class RestController extends \WP_REST_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
protected $namespace = 'wc/v3';
/**
* Endpoint path.
*
* @var string
*/
protected $rest_base = 'payments/multi-currency';
/**
* MultiCurrency instance.
*
* @var MultiCurrency
*/
protected $multi_currency;
/**
* Constructor.
*
* @param MultiCurrency $multi_currency MultiCurrency instance.
*/
public function __construct( MultiCurrency $multi_currency ) {
$this->multi_currency = $multi_currency;
}
/**
* Configure REST API routes.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/currencies',
[
'methods' => \WP_REST_Server::READABLE,
'callback' => [ $this, 'get_store_currencies' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/update-enabled-currencies',
[
'methods' => \WP_REST_Server::CREATABLE,
'args' => [
'enabled' => [
'type' => 'array',
'required' => true,
],
],
'callback' => [ $this, 'update_enabled_currencies' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/currencies/(?P<currency_code>[A-Za-z]{3})',
[
'methods' => \WP_REST_Server::READABLE,
'args' => [
'currency_code' => [
'type' => 'string',
'format' => 'text-field',
'required' => true,
],
],
'callback' => [ $this, 'get_single_currency_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/get-settings',
[
'methods' => \WP_REST_Server::READABLE,
'callback' => [ $this, 'get_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/currencies/(?P<currency_code>[A-Za-z]{3})',
[
'methods' => \WP_REST_Server::CREATABLE,
'args' => [
'currency_code' => [
'type' => 'string',
'format' => 'text-field',
'required' => true,
],
'exchange_rate_type' => [
'type' => 'string',
'format' => 'text-field',
'required' => true,
],
'manual_rate' => [
'type' => 'number',
'required' => false,
],
'price_rounding' => [
'type' => 'number',
'required' => true,
],
'price_charm' => [
'type' => 'number',
'required' => true,
],
],
'callback' => [ $this, 'update_single_currency_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/update-settings',
[
'methods' => \WP_REST_Server::CREATABLE,
'args' => [
'wcpay_multi_currency_enable_auto_currency' => [
'type' => 'string',
'format' => 'text-field',
'required' => true,
],
'wcpay_multi_currency_enable_storefront_switcher' => [
'type' => 'string',
'format' => 'text-field',
'required' => true,
],
],
'callback' => [ $this, 'update_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
}
/**
* Retrieve currencies for the store.
*
* @return \WP_REST_Response|\WP_Error Array of the store currencies structure.
*/
public function get_store_currencies() {
return rest_ensure_response( $this->multi_currency->get_store_currencies() );
}
/**
* Update enabled currencies based on posted data.
*
* @param \WP_REST_Request $request Full data about the request.
*
* @return \WP_REST_Response|\WP_Error The store currencies structure or WP_Error.
*/
public function update_enabled_currencies( $request ) {
$enabled = $request->get_param( 'enabled' );
try {
$this->multi_currency->set_enabled_currencies( $enabled );
$response = $this->get_store_currencies();
} catch ( InvalidCurrencyException $e ) {
$response = new \WP_Error( $e->getCode(), $e->getMessage() );
}
return rest_ensure_response( $response );
}
/**
* Gets the currency settings for a single currency.
*
* @param \WP_REST_Request $request Full data about the request.
*
* @return \WP_REST_Response|\WP_Error The single currency settings as an array.
*/
public function get_single_currency_settings( $request ) {
$currency_code = $request->get_param( 'currency_code' );
try {
$response = $this->multi_currency->get_single_currency_settings( $currency_code );
} catch ( InvalidCurrencyException $e ) {
$response = new \WP_Error( $e->getCode(), $e->getMessage() );
}
return rest_ensure_response( $response );
}
/**
* Updates the currency settings for a single currency.
*
* @param \WP_REST_Request $request Full data about the request.
*
* @return \WP_REST_Response|\WP_Error The single currency settings as an array.
*/
public function update_single_currency_settings( $request ) {
$currency_code = $request->get_param( 'currency_code' );
$exchange_rate_type = $request->get_param( 'exchange_rate_type' );
$price_rounding = $request->get_param( 'price_rounding' );
$price_charm = $request->get_param( 'price_charm' );
$manual_rate = $request->get_param( 'manual_rate' ) ?? null;
try {
$this->multi_currency->update_single_currency_settings( $currency_code, $exchange_rate_type, $price_rounding, $price_charm, $manual_rate );
$response = $this->multi_currency->get_single_currency_settings( $currency_code );
} catch ( Exception $e ) {
$response = new \WP_Error( $e->getCode(), $e->getMessage() );
}
return rest_ensure_response( $response );
}
/**
* Gets the store settings for Multi-Currency.
*
* @return \WP_REST_Response|\WP_Error The store settings as an array.
*/
public function get_settings() {
return rest_ensure_response( $this->multi_currency->get_settings() );
}
/**
* Updates Multi-Currency store settings parameters.
*
* @param \WP_REST_Request $request Full data about the request.
*
* @return \WP_REST_Response|\WP_Error The store settings as an array.
*/
public function update_settings( $request ) {
$params = $request->get_params();
$this->multi_currency->update_settings( $params );
return rest_ensure_response( $this->multi_currency->get_settings() );
}
/**
* Verify access.
*/
public function check_permission() {
return current_user_can( 'manage_woocommerce' );
}
}