2019-06-26 03:09:56 +00:00
< ? php
/**
2019-07-09 08:28:43 +00:00
* WCCOM Site Installer REST API Controller
2019-06-26 03:09:56 +00:00
*
2019-07-09 08:28:43 +00:00
* Handles requests to / installer .
2019-06-26 03:09:56 +00:00
*
2019-07-11 11:19:08 +00:00
* @ package WooCommerce / WCCOM_Site / REST_API
2019-06-26 03:09:56 +00:00
* @ since 3.7 . 0
*/
defined ( 'ABSPATH' ) || exit ;
/**
2019-07-11 11:19:08 +00:00
* REST API WCCOM Site Installer v1 Controller Class .
2019-06-26 03:09:56 +00:00
*
2019-07-11 11:19:08 +00:00
* @ package WooCommerce / WCCOM_Site / REST_API
2019-06-26 03:09:56 +00:00
* @ extends WC_REST_Controller
*/
2019-07-11 11:19:08 +00:00
class WC_REST_WCCOM_Site_Installer_V1_Controller extends WC_REST_Controller {
2019-06-26 03:09:56 +00:00
/**
* Endpoint namespace .
*
* @ var string
*/
2019-07-09 08:28:43 +00:00
protected $namespace = 'wccom-site/v1' ;
2019-06-26 03:09:56 +00:00
/**
* Route base .
*
* @ var string
*/
2019-07-09 08:28:43 +00:00
protected $rest_base = 'installer' ;
2019-06-26 03:09:56 +00:00
/**
* Register the routes for product reviews .
*/
public function register_routes () {
register_rest_route (
$this -> namespace , '/' . $this -> rest_base , array (
array (
'methods' => WP_REST_Server :: READABLE ,
'callback' => array ( $this , 'get_install_state' ),
'permission_callback' => array ( $this , 'check_permission' ),
),
array (
'methods' => WP_REST_Server :: CREATABLE ,
'callback' => array ( $this , 'install' ),
'permission_callback' => array ( $this , 'check_permission' ),
),
array (
'methods' => WP_REST_Server :: DELETABLE ,
'callback' => array ( $this , 'reset_install' ),
'permission_callback' => array ( $this , 'check_permission' ),
),
)
);
}
2019-07-09 08:55:40 +00:00
/**
* Check permissions .
*
* @ param WP_REST_Request $request Full details about the request .
*
* @ return bool | WP_Error
*/
2019-06-26 03:09:56 +00:00
public function check_permission ( $request ) {
2019-07-01 01:14:00 +00:00
if ( ! current_user_can ( 'install_plugins' ) || ! current_user_can ( 'install_themes' ) ) {
return new WP_Error ( 'woocommerce_rest_cannot_install_product' , __ ( 'You do not have permission to install plugin or theme' , 'woocommerce' ), array ( 'status' => 401 ) );
}
return true ;
2019-06-26 03:09:56 +00:00
}
2019-07-09 08:55:40 +00:00
/**
* Get installation state .
*
* @ param WP_REST_Request $request Full details about the request .
*
* @ return bool | WP_Error
*/
2019-06-26 03:09:56 +00:00
public function get_install_state ( $request ) {
2019-07-10 15:47:44 +00:00
return rest_ensure_response ( WC_WCCOM_Site_Installer :: get_state () );
2019-06-26 03:09:56 +00:00
}
2019-07-09 08:55:40 +00:00
/**
* Install WooCommerce . com products .
*
* @ param WP_REST_Request $request Full details about the request .
*
* @ return bool | WP_Error
*/
2019-06-26 03:09:56 +00:00
public function install ( $request ) {
2019-07-01 09:06:02 +00:00
$body = WP_REST_Server :: get_raw_data ();
if ( empty ( $body ) ) {
return new WP_Error ( 'empty_body' , __ ( 'Request body is empty.' , 'woocommerce' ), array ( 'status' => 400 ) );
}
$data = json_decode ( $body , true );
2019-07-10 18:40:24 +00:00
if ( empty ( $data [ 'products' ] ) ) {
2019-07-01 09:06:02 +00:00
return new WP_Error ( 'missing_products' , __ ( 'Missing products in request body.' , 'woocommerce' ), array ( 'status' => 400 ) );
}
2019-07-10 18:40:24 +00:00
$validation_result = $this -> validate_products ( $data [ 'products' ] );
if ( is_wp_error ( $validation_result ) ) {
return $validation_result ;
}
2019-07-10 15:47:44 +00:00
return rest_ensure_response ( WC_WCCOM_Site_Installer :: schedule_install ( $data [ 'products' ] ) );
2019-06-26 03:09:56 +00:00
}
2019-07-09 08:55:40 +00:00
/**
* Reset installation state .
*
* @ param WP_REST_Request $request Full details about the request .
*
* @ return bool | WP_Error
*/
2019-06-26 03:09:56 +00:00
public function reset_install ( $request ) {
2019-07-10 15:47:44 +00:00
$resp = rest_ensure_response ( WC_WCCOM_Site_Installer :: reset_state () );
2019-07-01 01:14:00 +00:00
$resp -> set_status ( 204 );
2019-06-26 03:09:56 +00:00
2019-07-01 01:14:00 +00:00
return $resp ;
2019-06-26 03:09:56 +00:00
}
2019-07-10 18:40:24 +00:00
/**
* Validate products from request body .
*
* @ param array $products Array of products where key is product ID and
* element is install args .
*
* @ return bool | WP_Error
*/
protected function validate_products ( $products ) {
$err = new WP_Error ( 'invalid_products' , __ ( 'Invalid products in request body.' , 'woocommerce' ), array ( 'status' => 400 ) );
if ( ! is_array ( $products ) ) {
return $err ;
}
foreach ( $products as $product_id => $install_args ) {
if ( ! absint ( $product_id ) ) {
return $err ;
}
if ( empty ( $install_args ) || ! is_array ( $install_args ) ) {
return $err ;
}
}
return true ;
}
2019-06-26 03:09:56 +00:00
}