This repository has been archived by the owner on Oct 4, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3 from woocommerce/add/endpoint-data-locations
Add location data endpoints
- Loading branch information
Showing
5 changed files
with
846 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,280 @@ | ||
<?php | ||
/** | ||
* REST API Data controller. | ||
* | ||
* Handles requests to the /data/continents endpoint. | ||
* | ||
* @author Automattic | ||
* @category API | ||
* @package WooCommerce/API | ||
* @since 3.1.0 | ||
*/ | ||
|
||
if ( ! defined( 'ABSPATH' ) ) { | ||
exit; | ||
} | ||
|
||
/** | ||
* REST API Data controller class. | ||
* | ||
* @package WooCommerce/API | ||
* @extends WC_REST_Controller | ||
*/ | ||
class WC_REST_Dev_Data_Continents_Controller extends WC_REST_Dev_Data_Controller { | ||
|
||
/** | ||
* Endpoint namespace. | ||
* | ||
* @var string | ||
*/ | ||
protected $namespace = 'wc/v3'; | ||
|
||
/** | ||
* Route base. | ||
* | ||
* @var string | ||
*/ | ||
protected $rest_base = 'data/continents'; | ||
|
||
/** | ||
* Register routes. | ||
* | ||
* @since 3.1.0 | ||
*/ | ||
public function register_routes() { | ||
register_rest_route( $this->namespace, '/' . $this->rest_base, array( | ||
array( | ||
'methods' => WP_REST_Server::READABLE, | ||
'callback' => array( $this, 'get_items' ), | ||
'permission_callback' => array( $this, 'get_items_permissions_check' ), | ||
), | ||
'schema' => array( $this, 'get_public_item_schema' ), | ||
) ); | ||
register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<location>[\w-]+)', array( | ||
array( | ||
'methods' => WP_REST_Server::READABLE, | ||
'callback' => array( $this, 'get_item' ), | ||
'permission_callback' => array( $this, 'get_items_permissions_check' ), | ||
'args' => array( | ||
'continent' => array( | ||
'description' => __( '2 character continent code.', 'woocommerce' ), | ||
'type' => 'string', | ||
), | ||
), | ||
), | ||
'schema' => array( $this, 'get_public_item_schema' ), | ||
) ); | ||
} | ||
|
||
/** | ||
* Return the list of countries and states for a given continent. | ||
* | ||
* @since 3.1.0 | ||
* @param string $continent_code | ||
* @param WP_REST_Request $request | ||
* @return array|mixed Response data, ready for insertion into collection data. | ||
*/ | ||
public function get_continent( $continent_code = false, $request ) { | ||
$continents = WC()->countries->get_continents(); | ||
$countries = WC()->countries->get_countries(); | ||
$states = WC()->countries->get_states(); | ||
$data = array(); | ||
|
||
if ( ! array_key_exists( $continent_code, $continents ) ) { | ||
return false; | ||
} | ||
|
||
$continent_list = $continents[ $continent_code ]; | ||
|
||
$continent = array( | ||
'code' => $continent_code, | ||
'name' => $continent_list['name'], | ||
); | ||
|
||
$local_countries = array(); | ||
foreach ( $continent_list['countries'] as $country_code ) { | ||
if ( isset( $countries[ $country_code ] ) ) { | ||
$country = array( | ||
'code' => $country_code, | ||
'name' => $countries[ $country_code ], | ||
); | ||
|
||
$local_states = array(); | ||
if ( isset( $states[ $country_code ] ) ) { | ||
foreach ( $states[ $country_code ] as $state_code => $state_name ) { | ||
$local_states[] = array( | ||
'code' => $state_code, | ||
'name' => $state_name, | ||
); | ||
} | ||
} | ||
$country['states'] = $local_states; | ||
$local_countries[] = $country; | ||
} | ||
} | ||
|
||
$continent['countries'] = $local_countries; | ||
return $continent; | ||
} | ||
|
||
/** | ||
* Return the list of states for all continents. | ||
* | ||
* @since 3.1.0 | ||
* @param WP_REST_Request $request | ||
* @return WP_Error|WP_REST_Response | ||
*/ | ||
public function get_items( $request ) { | ||
$continents = WC()->countries->get_continents(); | ||
$data = array(); | ||
|
||
foreach ( array_keys( $continents ) as $continent_code ) { | ||
$continent = $this->get_continent( $continent_code, $request ); | ||
$response = $this->prepare_item_for_response( $continent, $request ); | ||
$data[] = $this->prepare_response_for_collection( $response ); | ||
} | ||
|
||
return rest_ensure_response( $data ); | ||
} | ||
|
||
/** | ||
* Return the list of locations for a given continent. | ||
* | ||
* @since 3.1.0 | ||
* @param WP_REST_Request $request | ||
* @return WP_Error|WP_REST_Response | ||
*/ | ||
public function get_item( $request ) { | ||
$data = $this->get_continent( strtoupper( $request['location'] ), $request ); | ||
if ( empty( $data ) ) { | ||
return new WP_Error( 'woocommerce_rest_data_invalid_location', __( 'There are no locations matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) ); | ||
} | ||
return $this->prepare_item_for_response( $data, $request ); | ||
} | ||
|
||
/** | ||
* Prepare the data object for response. | ||
* | ||
* @since 3.1.0 | ||
* @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 ); | ||
|
||
$response->add_links( $this->prepare_links( $item ) ); | ||
|
||
/** | ||
* Filter the location list returned from the API. | ||
* | ||
* Allows modification of the loction data right before it is returned. | ||
* | ||
* @param WP_REST_Response $response The response object. | ||
* @param array $item The original list of continent(s), countries, and states. | ||
* @param WP_REST_Request $request Request used to generate the response. | ||
*/ | ||
return apply_filters( 'woocommerce_rest_prepare_data_continent', $response, $item, $request ); | ||
} | ||
|
||
/** | ||
* Prepare links for the request. | ||
* | ||
* @param object $item Data object. | ||
* @return array Links for the given continent. | ||
*/ | ||
protected function prepare_links( $item ) { | ||
$continent_code = strtolower( $item['code'] ); | ||
$links = array( | ||
'self' => array( | ||
'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $continent_code ) ), | ||
), | ||
'collection' => array( | ||
'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), | ||
), | ||
); | ||
return $links; | ||
} | ||
|
||
/** | ||
* Get the location schema, conforming to JSON Schema. | ||
* | ||
* @since 3.1.0 | ||
* @return array | ||
*/ | ||
public function get_item_schema() { | ||
$schema = array( | ||
'$schema' => 'http://json-schema.org/draft-04/schema#', | ||
'title' => 'data_continents', | ||
'type' => 'object', | ||
'properties' => array( | ||
'code' => array( | ||
'type' => 'string', | ||
'description' => __( '2 character continent code.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
'name' => array( | ||
'type' => 'string', | ||
'description' => __( 'Full name of continent.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
'countries' => array( | ||
'type' => 'array', | ||
'description' => __( 'List of countries on this continent.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
'items' => array( | ||
'type' => 'object', | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
'properties' => array( | ||
'code' => array( | ||
'type' => 'string', | ||
'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
'name' => array( | ||
'type' => 'string', | ||
'description' => __( 'Full name of country.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
'states' => array( | ||
'type' => 'array', | ||
'description' => __( 'List of states in this country.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
'items' => array( | ||
'type' => 'object', | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
'properties' => array( | ||
'code' => array( | ||
'type' => 'string', | ||
'description' => __( 'State code.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
'name' => array( | ||
'type' => 'string', | ||
'description' => __( 'Full name of state.', 'woocommerce' ), | ||
'context' => array( 'view' ), | ||
'readonly' => true, | ||
), | ||
), | ||
), | ||
), | ||
), | ||
), | ||
), | ||
), | ||
); | ||
|
||
return $this->add_additional_fields_schema( $schema ); | ||
} | ||
} |
Oops, something went wrong.