blob: e439969ec6ee0ca76da34a5265db9c56693ae409 [file] [log] [blame]
<?php
/**
* Class WC_REST_Stripe_Payment_Gateway_Controller
*/
defined( 'ABSPATH' ) || exit;
/**
* Dynamic REST controller for payment gateway settings.
*/
class WC_REST_Stripe_Payment_Gateway_Controller extends WC_Stripe_REST_Base_Controller {
/**
* Endpoint path.
*
* @var string
*/
protected $rest_base = 'wc_stripe/payment-gateway';
/**
* Stripe payment gateway.
*
* @var WC_Gateway_Stripe
*/
private $gateway;
/**
* Gateway match array.
*
* @var array
*/
private $gateways = [
'stripe_sepa' => WC_Gateway_Stripe_Sepa::class,
'stripe_giropay' => WC_Gateway_Stripe_Giropay::class,
'stripe_ideal' => WC_Gateway_Stripe_Ideal::class,
'stripe_bancontact' => WC_Gateway_Stripe_Bancontact::class,
'stripe_eps' => WC_Gateway_Stripe_Eps::class,
'stripe_sofort' => WC_Gateway_Stripe_Sofort::class,
'stripe_p24' => WC_Gateway_Stripe_P24::class,
'stripe_alipay' => WC_Gateway_Stripe_Alipay::class,
'stripe_multibanco' => WC_Gateway_Stripe_Multibanco::class,
'stripe_oxxo' => WC_Gateway_Stripe_Oxxo::class,
'stripe_boleto' => WC_Gateway_Stripe_Boleto::class,
];
/**
* Returns an instance of some WC_Gateway_Stripe.
*
* @return void
*/
private function instantiate_gateway( $gateway_id ) {
$this->gateway = new $this->gateways[ $gateway_id ]();
}
/**
* Configure REST API routes.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/(?P<payment_gateway_id>[a-z0-9_]+)',
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_payment_gateway_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/(?P<payment_gateway_id>[a-z0-9_]+)',
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'update_payment_gateway_settings' ],
'permission_callback' => [ $this, 'check_permission' ],
]
);
}
/**
* Retrieve payment gateway settings.
*
* @param WP_REST_Request $request
* @return WP_REST_Response
*/
public function get_payment_gateway_settings( $request = null ) {
try {
$id = $request->get_param( 'payment_gateway_id' );
$this->instantiate_gateway( $id );
$settings = [
'is_' . $id . '_enabled' => $this->gateway->is_enabled(),
$id . '_name' => $this->gateway->get_option( 'title' ),
$id . '_description' => $this->gateway->get_option( 'description' ),
];
if ( method_exists( $this->gateway, 'get_unique_settings' ) ) {
$settings = $this->gateway->get_unique_settings( $settings );
}
return new WP_REST_Response( $settings );
} catch ( Exception $exception ) {
return new WP_REST_Response( [ 'result' => 'bad_request' ], 400 );
}
}
/**
* Update payment gateway settings.
*
* @param WP_REST_Request $request Request object.
*/
public function update_payment_gateway_settings( WP_REST_Request $request ) {
try {
$id = $request->get_param( 'payment_gateway_id' );
$this->instantiate_gateway( $id );
$this->update_is_gateway_enabled( $request );
$this->update_gateway_name( $request );
$this->update_gateway_description( $request );
if ( method_exists( $this->gateway, 'update_unique_settings' ) ) {
$this->gateway->update_unique_settings( $request );
}
return new WP_REST_Response( [], 200 );
} catch ( Exception $exception ) {
return new WP_REST_Response( [ 'result' => 'bad_request' ], 400 );
}
}
/**
* Updates payment gateway enabled status.
*
* @param WP_REST_Request $request Request object.
*/
private function update_is_gateway_enabled( WP_REST_Request $request ) {
$field_name = 'is_' . $this->gateway->id . '_enabled';
$is_enabled = $request->get_param( $field_name );
if ( null === $is_enabled || ! is_bool( $is_enabled ) ) {
return;
}
if ( $is_enabled ) {
$this->gateway->enable();
} else {
$this->gateway->disable();
}
}
/**
* Updates payment gateway title.
*
* @param WP_REST_Request $request Request object.
*/
private function update_gateway_name( WP_REST_Request $request ) {
$field_name = $this->gateway->id . '_name';
$name = $request->get_param( $field_name );
if ( null === $name ) {
return;
}
$value = sanitize_text_field( $name );
$this->gateway->update_option( 'title', $value );
}
/**
* Updates payment gateway description.
*
* @param WP_REST_Request $request Request object.
*/
private function update_gateway_description( WP_REST_Request $request ) {
$field_name = $this->gateway->id . '_description';
$description = $request->get_param( $field_name );
if ( null === $description ) {
return;
}
$value = sanitize_text_field( $description );
$this->gateway->update_option( 'description', $value );
}
}