diff --git a/lib/compat/wordpress-6.4/rest-api.php b/lib/compat/wordpress-6.4/rest-api.php index 7c81a6a274c03a..274eb3af945439 100644 --- a/lib/compat/wordpress-6.4/rest-api.php +++ b/lib/compat/wordpress-6.4/rest-api.php @@ -18,12 +18,3 @@ function gutenberg_register_rest_block_patterns_routes() { $block_patterns->register_routes(); } add_action( 'rest_api_init', 'gutenberg_register_rest_block_patterns_routes' ); - -/** - * Registers the Global Styles Revisions REST API routes. - */ -function gutenberg_register_global_styles_revisions_endpoints() { - $global_styles_revisions_controller = new Gutenberg_REST_Global_Styles_Revisions_Controller_6_4(); - $global_styles_revisions_controller->register_routes(); -} -add_action( 'rest_api_init', 'gutenberg_register_global_styles_revisions_endpoints' ); diff --git a/lib/compat/wordpress-6.5/class-gutenberg-rest-global-styles-revisions-controller-6-5.php b/lib/compat/wordpress-6.5/class-gutenberg-rest-global-styles-revisions-controller-6-5.php new file mode 100644 index 00000000000000..e7b2ac85f6e525 --- /dev/null +++ b/lib/compat/wordpress-6.5/class-gutenberg-rest-global-styles-revisions-controller-6-5.php @@ -0,0 +1,102 @@ +namespace, + '/' . $this->parent_base . '/(?P[\d]+)/' . $this->rest_base . '/(?P[\d]+)', + array( + 'args' => array( + 'parent' => array( + 'description' => __( 'The ID for the parent of the global styles revision.' ), + 'type' => 'integer', + ), + 'id' => array( + 'description' => __( 'Unique identifier for the global styles revision.' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + parent::register_routes(); + } + + /** + * Retrieves one global styles revision from the collection. + * + * @since 6.5.0 + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. + */ + public function get_item( $request ) { + $parent = $this->get_parent( $request['parent'] ); + if ( is_wp_error( $parent ) ) { + return $parent; + } + + $revision = $this->get_revision( $request['id'] ); + if ( is_wp_error( $revision ) ) { + return $revision; + } + + $response = $this->prepare_item_for_response( $revision, $request ); + return rest_ensure_response( $response ); + } + + /** + * Get the global styles revision, if the ID is valid. + * + * @since 6.5.0 + * + * @param int $id Supplied ID. + * @return WP_Post|WP_Error Revision post object if ID is valid, WP_Error otherwise. + */ + protected function get_revision( $id ) { + $error = new WP_Error( + 'rest_post_invalid_id', + __( 'Invalid revision ID.' ), + array( 'status' => 404 ) + ); + + if ( (int) $id <= 0 ) { + return $error; + } + + $revision = get_post( (int) $id ); + if ( empty( $revision ) || empty( $revision->ID ) || 'revision' !== $revision->post_type ) { + return $error; + } + + return $revision; + } +} diff --git a/lib/compat/wordpress-6.5/rest-api.php b/lib/compat/wordpress-6.5/rest-api.php new file mode 100644 index 00000000000000..dd372eff7943b7 --- /dev/null +++ b/lib/compat/wordpress-6.5/rest-api.php @@ -0,0 +1,21 @@ +register_routes(); +} + +add_action( 'rest_api_init', 'gutenberg_register_global_styles_revisions_endpoints' ); diff --git a/lib/load.php b/lib/load.php index 5740e43b5f76a1..711766dec7dfbd 100644 --- a/lib/load.php +++ b/lib/load.php @@ -56,6 +56,10 @@ function gutenberg_is_experiment_enabled( $name ) { require_once __DIR__ . '/compat/wordpress-6.4/rest-api.php'; require_once __DIR__ . '/compat/wordpress-6.4/theme-previews.php'; + // WordPress 6.5 compat. + require_once __DIR__ . '/compat/wordpress-6.5/class-gutenberg-rest-global-styles-revisions-controller-6-5.php'; + require_once __DIR__ . '/compat/wordpress-6.5/rest-api.php'; + // Plugin specific code. require_once __DIR__ . '/class-wp-rest-global-styles-controller-gutenberg.php'; require_once __DIR__ . '/rest-api.php'; diff --git a/phpunit/class-gutenberg-rest-global-styles-revisions-controller-test.php b/phpunit/class-gutenberg-rest-global-styles-revisions-controller-test.php index 1b8e672fa78199..857e8fa297cf17 100644 --- a/phpunit/class-gutenberg-rest-global-styles-revisions-controller-test.php +++ b/phpunit/class-gutenberg-rest-global-styles-revisions-controller-test.php @@ -242,6 +242,11 @@ public function test_register_routes() { $routes, 'Global style revisions based on the given parentID route does not exist.' ); + $this->assertArrayHasKey( + '/wp/v2/global-styles/(?P[\d]+)/revisions/(?P[\d]+)', + $routes, + 'Single global style revisions based on the given parentID and revision ID route does not exist.' + ); } /** @@ -298,6 +303,38 @@ public function test_get_items() { $this->check_get_revision_response( $data[2], $this->revision_1 ); } + /** + * @ticket 59810 + * + * @covers Gutenberg_REST_Global_Styles_Revisions_Controller_6_4::get_item + */ + public function test_get_item() { + wp_set_current_user( self::$admin_id ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions/' . $this->revision_1_id ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + $this->assertSame( 200, $response->get_status(), 'Response status is 200.' ); + $this->check_get_revision_response( $data, $this->revision_1 ); + } + + /** + * @ticket 59810 + * + * @covers Gutenberg_REST_Global_Styles_Revisions_Controller_6_4::get_revision + */ + public function test_get_item_invalid_revision_id_should_error() { + wp_set_current_user( self::$admin_id ); + + $expected_error = 'rest_post_invalid_id'; + $expected_status = 404; + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions/20000001' ); + $response = rest_get_server()->dispatch( $request ); + + $this->assertErrorResponse( $expected_error, $response, $expected_status ); + } + /** * @ticket 58524 * @@ -320,6 +357,7 @@ public function test_get_item_schema() { $this->assertArrayHasKey( 'modified', $properties, 'Schema properties array has "modified" key.' ); $this->assertArrayHasKey( 'modified_gmt', $properties, 'Schema properties array has "modified_gmt" key.' ); } + /** * @doesNotPerformAssertions */ @@ -327,13 +365,6 @@ public function test_context_param() { // Controller does not implement test_context_param(). } - /** - * @doesNotPerformAssertions - */ - public function test_get_item() { - // Controller does not implement get_item(). - } - /** * @doesNotPerformAssertions */