<?php
declare( strict_types=1 );
namespace Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter;
use Automattic\WooCommerce\GoogleListingsAndAds\API\TransportMethods;
use WP_REST_Request as Request;
use WP_REST_Response as Response;
defined( 'ABSPATH' ) || exit;
/**
* Class ShippingRateBatchController
*
* @package Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter
*/
class ShippingRateBatchController extends ShippingRateController {
/**
* Register rest routes with WordPress.
*/
public function register_routes(): void {
$this->register_route(
"{$this->route_base}/batch",
[
[
'methods' => TransportMethods::CREATABLE,
'callback' => $this->get_batch_create_callback(),
'permission_callback' => $this->get_permission_callback(),
'args' => $this->get_batch_create_args_schema(),
],
[
'methods' => TransportMethods::DELETABLE,
'callback' => $this->get_batch_delete_shipping_callback(),
'permission_callback' => $this->get_permission_callback(),
'args' => $this->get_batch_delete_args_schema(),
],
'schema' => $this->get_api_response_schema_callback(),
]
);
}
/**
* Get the callback for creating items via batch.
*
* @return callable
*/
protected function get_batch_create_callback(): callable {
return function ( Request $request ) {
$rates = $request->get_param( 'rates' );
$responses = [];
$errors = [];
foreach ( $rates as $rate ) {
$new_request = new Request( 'POST', "/{$this->get_namespace()}/{$this->route_base}" );
$new_request->set_body_params( $rate );
$response = $this->server->dispatch_request( $new_request );
if ( 201 !== $response->get_status() ) {
$errors[] = $response->get_data();
} else {
$responses[] = $response->get_data();
}
}
return new Response(
[
'errors' => $errors,
'success' => $responses,
],
201
);
};
}
/**
* Get the callback for deleting shipping items via batch.
*
* @return callable
*
* @since 1.12.0
*/
protected function get_batch_delete_shipping_callback(): callable {
return function ( Request $request ) {
$ids = $request->get_param( 'ids' );
$responses = [];
$errors = [];
foreach ( $ids as $id ) {
$route = "/{$this->get_namespace()}/{$this->route_base}/{$id}";
$delete_request = new Request( 'DELETE', $route );
$response = $this->server->dispatch_request( $delete_request );
if ( 200 !== $response->get_status() ) {
$errors[] = $response->get_data();
} else {
$responses[] = $response->get_data();
}
}
return new Response(
[
'errors' => $errors,
'success' => $responses,
],
);
};
}
/**
* Get the argument schema for a batch create request.
*
* @return array
*
* @since 1.12.0
*/
protected function get_batch_create_args_schema(): array {
return [
'rates' => [
'type' => 'array',
'minItems' => 1,
'uniqueItems' => true,
'description' => __( 'Array of shipping rates to create.', 'google-listings-and-ads' ),
'validate_callback' => 'rest_validate_request_arg',
'items' => [
'type' => 'object',
'additionalProperties' => false,
'properties' => $this->get_schema_properties(),
],
],
];
}
/**
* Get the argument schema for a batch delete request.
*
* @return array
*
* @since 1.12.0
*/
protected function get_batch_delete_args_schema(): array {
return [
'ids' => [
'type' => 'array',
'description' => __( 'Array of unique shipping rate identification numbers.', 'google-listings-and-ads' ),
'context' => [ 'edit' ],
'minItems' => 1,
'required' => true,
'uniqueItems' => true,
],
];
}
/**
* Get the item schema name for the controller.
*
* Used for building the API response schema.
*
* @return string
*/
protected function get_schema_title(): string {
return 'batch_shipping_rates';
}
}