blob: e67baa98ede3b14f4e8ee7cb53cfd98fbaf59f28 [file] [log] [blame]
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// phpcs:disable WordPress.Files.FileName
/**
* Stripe Connect base REST controller class.
*/
abstract class WC_Stripe_Connect_REST_Controller extends WP_REST_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
protected $namespace = 'wc/v1';
/**
* Stripe connect api.
*
* @var object $api
*/
private $api;
/**
* Constructor.
*
* @param WC_Stripe_Connect_API $api stripe connect api.
*/
public function __construct( WC_Stripe_Connect_API $api ) {
$this->api = $api;
}
/**
* Registers rest routes for stripe connect functionality
*/
public function register_routes() {
if ( method_exists( $this, 'get' ) ) {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
[
[
'methods' => 'GET',
'callback' => [ $this, 'get_internal' ],
'permission_callback' => [ $this, 'check_permission' ],
],
]
);
}
if ( method_exists( $this, 'post' ) ) {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
[
[
'methods' => 'POST',
'callback' => [ $this, 'post_internal' ],
'permission_callback' => [ $this, 'check_permission' ],
],
]
);
}
if ( method_exists( $this, 'delete' ) ) {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
[
[
'methods' => 'DELETE',
'callback' => [ $this, 'delete_internal' ],
'permission_callback' => [ $this, 'check_permission' ],
],
]
);
}
}
/**
* Send get request.
*
* @param array $request request.
*
* @return array
*/
public function get_internal( $request ) {
$this->prevent_route_caching();
return $this->get( $request );
}
/**
* Send post request.
*
* @param array $request request.
*
* @return array
*/
public function post_internal( $request ) {
$this->prevent_route_caching();
return $this->post( $request );
}
/**
* Sends delete request.
*
* @param array $request request.
*
* @return array
*/
public function delete_internal( $request ) {
$this->prevent_route_caching();
return $this->delete( $request );
}
/**
* Validate the requester's permissions
*
* @param array $request request.
*
* @return bool
*/
public function check_permission( $request ) {
return current_user_can( 'manage_woocommerce' );
}
/**
* Consolidate cache prevention mechanisms.
*/
public function prevent_route_caching() {
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( 'DONOTCACHEPAGE', true ); // Play nice with WP-Super-Cache.
}
// Prevent our REST API endpoint responses from being added to browser cache.
add_filter( 'rest_post_dispatch', [ $this, 'send_nocache_header' ], PHP_INT_MAX, 2 );
}
/**
* Send a no-cache header for WCS REST API responses. Prompted by cache issues
* on the Pantheon hosting platform.
*
* See: https://pantheon.io/docs/cache-control/
*
* @param WP_REST_Response $response REST API response.
* @param WP_REST_Server $server server.
*
* @return WP_REST_Response passthrough $response parameter
*/
public function send_nocache_header( $response, $server ) {
$server->send_header( 'Cache-Control', 'no-cache, must-revalidate, max-age=0' );
return $response;
}
}