<?php declare( strict_types=1 ); namespace Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter; use Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\BaseController; use Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\ShippingRateSchemaTrait; use Automattic\WooCommerce\GoogleListingsAndAds\API\TransportMethods; use Automattic\WooCommerce\GoogleListingsAndAds\Internal\Interfaces\ISO3166AwareInterface; use Automattic\WooCommerce\GoogleListingsAndAds\Proxies\RESTServer; use Automattic\WooCommerce\GoogleListingsAndAds\Shipping\ShippingSuggestionService; use WP_REST_Request as Request; defined( 'ABSPATH' ) || exit; /** * Class ShippingRateSuggestionsController * * @package Automattic\WooCommerce\GoogleListingsAndAds\API\Site\Controllers\MerchantCenter * * @since 1.12.0 */ class ShippingRateSuggestionsController extends BaseController implements ISO3166AwareInterface { use ShippingRateSchemaTrait; /** * The base for routes in this controller. * * @var string */ protected $route_base = 'mc/shipping/rates/suggestions'; /** * @var ShippingSuggestionService */ protected $shipping_suggestion; /** * ShippingRateSuggestionsController constructor. * * @param RESTServer $server * @param ShippingSuggestionService $shipping_suggestion */ public function __construct( RESTServer $server, ShippingSuggestionService $shipping_suggestion ) { parent::__construct( $server ); $this->shipping_suggestion = $shipping_suggestion; } /** * Register rest routes with WordPress. */ public function register_routes(): void { $this->register_route( "{$this->route_base}", [ [ 'methods' => TransportMethods::READABLE, 'callback' => $this->get_suggestions_callback(), 'permission_callback' => $this->get_permission_callback(), 'args' => [ 'country_codes' => [ 'type' => 'array', 'description' => __( 'Array of country codes in ISO 3166-1 alpha-2 format.', 'google-listings-and-ads' ), 'context' => [ 'edit' ], 'sanitize_callback' => $this->get_country_code_sanitize_callback(), 'validate_callback' => $this->get_country_code_validate_callback(), 'minItems' => 1, 'required' => true, 'uniqueItems' => true, 'items' => [ 'type' => 'string', ], ], ], ], 'schema' => $this->get_api_response_schema_callback(), ] ); } /** * Get the callback function for returning the endpoint results. * * @return callable */ protected function get_suggestions_callback(): callable { return function ( Request $request ) { $country_codes = $request->get_param( 'country_codes' ); $rates_output = []; foreach ( $country_codes as $country_code ) { $suggestions = $this->shipping_suggestion->get_suggestions( $country_code ); // Prepare the output. $suggestions = array_map( function ( $suggestion ) use ( $request ) { $response = $this->prepare_item_for_response( $suggestion, $request ); return $this->prepare_response_for_collection( $response ); }, $suggestions ); // Merge the suggestions for all countries into one array. $rates_output = array_merge( $rates_output, $suggestions ); } return $rates_output; }; } /** * @return array */ protected function get_schema_properties(): array { $schema = $this->get_shipping_rate_schema(); // Suggested shipping rates don't have an id. unset( $schema['id'] ); // All properties are read-only. return array_map( function ( $property ) { $property['readonly'] = true; $property['context'] = [ 'view' ]; return $property; }, $schema ); } /** * Get the item schema name for the controller. * * Used for building the API response schema. * * @return string */ protected function get_schema_title(): string { return 'shipping_rates_suggestions'; } }