* REST API Reports Import Controller
* Handles requests to /reports/import
namespace Automattic\WooCommerce\Admin\API\Reports\Import;
defined( 'ABSPATH' ) || exit;
use Automattic\WooCommerce\Admin\ReportsSync;
* Reports Imports controller.
* @extends \Automattic\WooCommerce\Admin\API\Reports\Controller
class Controller extends \Automattic\WooCommerce\Admin\API\Reports\Controller {
protected $rest_base = 'reports/import';
public function register_routes() {
'methods' => \WP_REST_Server::EDITABLE,
'callback' => array( $this, 'import_items' ),
'permission_callback' => array( $this, 'import_permissions_check' ),
'args' => $this->get_import_collection_params(),
'schema' => array( $this, 'get_import_public_schema' ),
'/' . $this->rest_base . '/cancel',
'methods' => \WP_REST_Server::EDITABLE,
'callback' => array( $this, 'cancel_import' ),
'permission_callback' => array( $this, 'import_permissions_check' ),
'schema' => array( $this, 'get_import_public_schema' ),
'/' . $this->rest_base . '/delete',
'methods' => \WP_REST_Server::EDITABLE,
'callback' => array( $this, 'delete_imported_items' ),
'permission_callback' => array( $this, 'import_permissions_check' ),
'schema' => array( $this, 'get_import_public_schema' ),
'/' . $this->rest_base . '/status',
'methods' => \WP_REST_Server::READABLE,
'callback' => array( $this, 'get_import_status' ),
'permission_callback' => array( $this, 'import_permissions_check' ),
'schema' => array( $this, 'get_import_public_schema' ),
'/' . $this->rest_base . '/totals',
'methods' => \WP_REST_Server::READABLE,
'callback' => array( $this, 'get_import_totals' ),
'permission_callback' => array( $this, 'import_permissions_check' ),
'args' => $this->get_import_collection_params(),
'schema' => array( $this, 'get_import_public_schema' ),
* Makes sure the current user has access to WRITE the settings APIs.
* @param WP_REST_Request $request Full data about the request.
public function import_permissions_check( $request ) {
if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) {
return new \WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
* Import data based on user request params.
* @param WP_REST_Request $request Request data.
* @return WP_Error|WP_REST_Response
public function import_items( $request ) {
$query_args = $this->prepare_objects_query( $request );
$import = ReportsSync::regenerate_report_data( $query_args['days'], $query_args['skip_existing'] );
if ( is_wp_error( $import ) ) {
'message' => $import->get_error_message(),
$response = $this->prepare_item_for_response( $result, $request );
$data = $this->prepare_response_for_collection( $response );
return rest_ensure_response( $data );
* Prepare request object as query args.
* @param WP_REST_Request $request Request data.
protected function prepare_objects_query( $request ) {
$args['skip_existing'] = $request['skip_existing'];
$args['days'] = $request['days'];
* Prepare the data object for response.
* @param object $item Data object.
* @param WP_REST_Request $request Request object.
* @return WP_REST_Response $response Response data.
public function prepare_item_for_response( $item, $request ) {
$data = $this->add_additional_fields_to_object( $item, $request );
$data = $this->filter_response_by_context( $data, 'view' );
$response = rest_ensure_response( $data );
* Filter the list returned from the API.
* @param WP_REST_Response $response The response object.
* @param array $item The original item.
* @param WP_REST_Request $request Request used to generate the response.
return apply_filters( 'woocommerce_rest_prepare_reports_import', $response, $item, $request );
* Get the query params for collections.
public function get_import_collection_params() {
'description' => __( 'Number of days to import.', 'woocommerce' ),
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
$params['skip_existing'] = array(
'description' => __( 'Skip importing existing order data.', 'woocommerce' ),
'sanitize_callback' => 'wc_string_to_bool',
'validate_callback' => 'rest_validate_request_arg',
* Get the Report's schema, conforming to JSON Schema.
public function get_import_public_schema() {
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'report_import',
'description' => __( 'Regeneration status.', 'woocommerce' ),
'context' => array( 'view', 'edit' ),
'description' => __( 'Regenerate data message.', 'woocommerce' ),
'context' => array( 'view', 'edit' ),
return $this->add_additional_fields_schema( $schema );
* Cancel all queued import actions.
* @param WP_REST_Request $request Request data.
* @return WP_Error|WP_REST_Response
public function cancel_import( $request ) {
ReportsSync::clear_queued_actions();
'message' => __( 'All pending and in-progress import actions have been cancelled.', 'woocommerce' ),
$response = $this->prepare_item_for_response( $result, $request );
$data = $this->prepare_response_for_collection( $response );
return rest_ensure_response( $data );
* Delete all imported items.
* @param WP_REST_Request $request Request data.
* @return WP_Error|WP_REST_Response
public function delete_imported_items( $request ) {
$delete = ReportsSync::delete_report_data();
if ( is_wp_error( $delete ) ) {
'message' => $delete->get_error_message(),
$response = $this->prepare_item_for_response( $result, $request );
$data = $this->prepare_response_for_collection( $response );
return rest_ensure_response( $data );
* Get the status of the current import.
* @param WP_REST_Request $request Request data.
* @return WP_Error|WP_REST_Response
public function get_import_status( $request ) {
$result = ReportsSync::get_import_stats();
$response = $this->prepare_item_for_response( $result, $request );
$data = $this->prepare_response_for_collection( $response );
return rest_ensure_response( $data );
* Get the total orders and customers based on user supplied params.
* @param WP_REST_Request $request Request data.
* @return WP_Error|WP_REST_Response
public function get_import_totals( $request ) {
$query_args = $this->prepare_objects_query( $request );
$totals = ReportsSync::get_import_totals( $query_args['days'], $query_args['skip_existing'] );
$response = $this->prepare_item_for_response( $totals, $request );
$data = $this->prepare_response_for_collection( $response );
return rest_ensure_response( $data );