woocommerce/packages/woocommerce-blocks/src/StoreApi/RoutesController.php

109 lines
4.5 KiB
PHP

<?php
namespace Automattic\WooCommerce\Blocks\StoreApi;
use Routes\AbstractRoute;
use Automattic\WooCommerce\Blocks\StoreApi\Utilities\CartController;
use Automattic\WooCommerce\Blocks\StoreApi\Utilities\OrderController;
/**
* RoutesController class.
*
* @internal This API is used internally by Blocks--it is still in flux and may be subject to revisions.
*/
class RoutesController {
/**
* Stores schemas.
*
* @var SchemaController
*/
protected $schemas;
/**
* Stores routes.
*
* @var AbstractRoute[]
*/
protected $routes = [];
/**
* Constructor.
*
* @param SchemaController $schemas Schema controller class passed to each route.
*/
public function __construct( SchemaController $schemas ) {
$this->schemas = $schemas;
$this->initialize();
}
/**
* Get a route class instance.
*
* @throws Exception If the schema does not exist.
*
* @param string $name Name of schema.
* @return AbstractRoute
*/
public function get( $name ) {
if ( ! isset( $this->routes[ $name ] ) ) {
throw new Exception( $name . ' route does not exist' );
}
return $this->routes[ $name ];
}
/**
* Register defined list of routes with WordPress.
*/
public function register_routes() {
foreach ( $this->routes as $route ) {
register_rest_route(
$route->get_namespace(),
$route->get_path(),
$route->get_args()
);
}
}
/**
* Load route class instances.
*/
protected function initialize() {
global $wp_version;
$cart_controller = new CartController();
$order_controller = new OrderController();
$this->routes = [
'cart' => new Routes\Cart( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-add-item' => new Routes\CartAddItem( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-apply-coupon' => new Routes\CartApplyCoupon( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-coupons' => new Routes\CartCoupons( $this->schemas->get( 'cart' ), $this->schemas->get( 'cart-coupon' ), $cart_controller ),
'cart-coupons-by-code' => new Routes\CartCouponsByCode( $this->schemas->get( 'cart' ), $this->schemas->get( 'cart-coupon' ), $cart_controller ),
'cart-extensions' => new Routes\CartExtensions( $this->schemas->get( 'cart' ), $this->schemas->get( 'cart-extensions' ), $cart_controller ),
'cart-items' => new Routes\CartItems( $this->schemas->get( 'cart' ), $this->schemas->get( 'cart-item' ), $cart_controller ),
'cart-items-by-key' => new Routes\CartItemsByKey( $this->schemas->get( 'cart' ), $this->schemas->get( 'cart-item' ), $cart_controller ),
'cart-remove-coupon' => new Routes\CartRemoveCoupon( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-remove-item' => new Routes\CartRemoveItem( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-select-shipping-rate' => new Routes\CartSelectShippingRate( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-update-item' => new Routes\CartUpdateItem( $this->schemas->get( 'cart' ), null, $cart_controller ),
'cart-update-customer' => new Routes\CartUpdateCustomer( $this->schemas->get( 'cart' ), null, $cart_controller ),
'checkout' => new Routes\Checkout( $this->schemas->get( 'cart' ), $this->schemas->get( 'checkout' ), $cart_controller, $order_controller ),
'product-attributes' => new Routes\ProductAttributes( $this->schemas->get( 'product-attribute' ) ),
'product-attributes-by-id' => new Routes\ProductAttributesById( $this->schemas->get( 'product-attribute' ) ),
'product-attribute-terms' => new Routes\ProductAttributeTerms( $this->schemas->get( 'term' ) ),
'product-categories' => new Routes\ProductCategories( $this->schemas->get( 'product-category' ) ),
'product-categories-by-id' => new Routes\ProductCategoriesById( $this->schemas->get( 'product-category' ) ),
'product-collection-data' => new Routes\ProductCollectionData( $this->schemas->get( 'product-collection-data' ) ),
'product-reviews' => new Routes\ProductReviews( $this->schemas->get( 'product-review' ) ),
'product-tags' => new Routes\ProductTags( $this->schemas->get( 'term' ) ),
'products' => new Routes\Products( $this->schemas->get( 'product' ) ),
'products-by-id' => new Routes\ProductsById( $this->schemas->get( 'product' ) ),
];
// Batching requires WP 5.6.
if ( version_compare( $wp_version, '5.6', '>=' ) ) {
$this->routes['batch'] = new Routes\Batch();
}
}
}