Initial commit
diff --git a/includes/admin/class-wc-rest-stripe-payment-gateway-controller.php b/includes/admin/class-wc-rest-stripe-payment-gateway-controller.php
new file mode 100644
index 0000000..e439969
--- /dev/null
+++ b/includes/admin/class-wc-rest-stripe-payment-gateway-controller.php
@@ -0,0 +1,177 @@
+<?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 );
+ }
+}