Make WordPress Core

Changeset 57494


Ignore:
Timestamp:
01/31/2024 10:39:04 AM (6 months ago)
Author:
youknowriad
Message:

REST API: Add route for single styles revisions.

Adds a route for single global styles revisions: /wp/v2/global-styles/${ parentId }/revisions/${ revisionsId }
This fixes the getRevision actions in the core-data package.

Props ramonopoly, get_dave.
Fixes #59810.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php

    r56272 r57494  
    4848     *
    4949     * @since 6.3.0
     50     * @since 6.5.0 Added route to fetch individual global styles revisions.
    5051     */
    5152    public function register_routes() {
     
    6566                    'permission_callback' => array( $this, 'get_item_permissions_check' ),
    6667                    'args'                => $this->get_collection_params(),
     68                ),
     69                'schema' => array( $this, 'get_public_item_schema' ),
     70            )
     71        );
     72
     73        register_rest_route(
     74            $this->namespace,
     75            '/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',
     76            array(
     77                'args'   => array(
     78                    'parent' => array(
     79                        'description' => __( 'The ID for the parent of the global styles revision.' ),
     80                        'type'        => 'integer',
     81                    ),
     82                    'id'     => array(
     83                        'description' => __( 'Unique identifier for the global styles revision.' ),
     84                        'type'        => 'integer',
     85                    ),
     86                ),
     87                array(
     88                    'methods'             => WP_REST_Server::READABLE,
     89                    'callback'            => array( $this, 'get_item' ),
     90                    'permission_callback' => array( $this, 'get_item_permissions_check' ),
     91                    'args'                => array(
     92                        'context' => $this->get_context_param( array( 'default' => 'view' ) ),
     93                    ),
    6794                ),
    6895                'schema' => array( $this, 'get_public_item_schema' ),
     
    243270
    244271    /**
     272     * Retrieves one global styles revision from the collection.
     273     *
     274     * @since 6.5.0
     275     *
     276     * @param WP_REST_Request $request Full details about the request.
     277     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
     278     */
     279    public function get_item( $request ) {
     280        $parent = $this->get_parent( $request['parent'] );
     281        if ( is_wp_error( $parent ) ) {
     282            return $parent;
     283        }
     284
     285        $revision = $this->get_revision( $request['id'] );
     286        if ( is_wp_error( $revision ) ) {
     287            return $revision;
     288        }
     289
     290        $response = $this->prepare_item_for_response( $revision, $request );
     291        return rest_ensure_response( $response );
     292    }
     293
     294    /**
     295     * Gets the global styles revision, if the ID is valid.
     296     *
     297     * @since 6.5.0
     298     *
     299     * @param int $id Supplied ID.
     300     * @return WP_Post|WP_Error Revision post object if ID is valid, WP_Error otherwise.
     301     */
     302    protected function get_revision( $id ) {
     303        $error = new WP_Error(
     304            'rest_post_invalid_id',
     305            __( 'Invalid global styles revision ID.' ),
     306            array( 'status' => 404 )
     307        );
     308
     309        if ( (int) $id <= 0 ) {
     310            return $error;
     311        }
     312
     313        $revision = get_post( (int) $id );
     314        if ( empty( $revision ) || empty( $revision->ID ) || 'revision' !== $revision->post_type ) {
     315            return $error;
     316        }
     317
     318        return $revision;
     319    }
     320
     321    /**
    245322     * Checks the post_date_gmt or modified_gmt and prepare any post or
    246323     * modified date for single post output.
  • trunk/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php

    r56714 r57494  
    227227    /**
    228228     * @ticket 58524
     229     * @ticket 59810
    229230     *
    230231     * @covers WP_REST_Global_Styles_Controller::register_routes
     
    236237            $routes,
    237238            'Global style revisions based on the given parentID route does not exist.'
     239        );
     240        $this->assertArrayHasKey(
     241            '/wp/v2/global-styles/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
     242            $routes,
     243            'Single global style revisions based on the given parentID and revision ID route does not exist.'
    238244        );
    239245    }
     
    303309        $this->assertSame( $this->revision_1_id, $data[2]['id'] );
    304310        $this->check_get_revision_response( $data[2], $this->revision_1 );
     311    }
     312
     313    /**
     314     * @ticket 59810
     315     *
     316     * @covers WP_REST_Global_Styles_Controller::get_item
     317     */
     318    public function test_get_item() {
     319        wp_set_current_user( self::$admin_id );
     320
     321        $request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions/' . $this->revision_1_id );
     322        $response = rest_get_server()->dispatch( $request );
     323        $data     = $response->get_data();
     324
     325        $this->assertSame( 200, $response->get_status(), 'Response status is 200.' );
     326        $this->check_get_revision_response( $data, $this->revision_1 );
     327    }
     328
     329    /**
     330     * @ticket 59810
     331     *
     332     * @covers WP_REST_Global_Styles_Controller::get_revision
     333     */
     334    public function test_get_item_invalid_revision_id_should_error() {
     335        wp_set_current_user( self::$admin_id );
     336
     337        $expected_error  = 'rest_post_invalid_id';
     338        $expected_status = 404;
     339        $request         = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions/20000001' );
     340        $response        = rest_get_server()->dispatch( $request );
     341
     342        $this->assertErrorResponse( $expected_error, $response, $expected_status );
    305343    }
    306344
     
    798836     * @doesNotPerformAssertions
    799837     */
    800     public function test_get_item() {
    801         // Controller does not implement get_item().
    802     }
    803 
    804     /**
    805      * @doesNotPerformAssertions
    806      */
    807838    public function test_create_item() {
    808839        // Controller does not implement create_item().
  • trunk/tests/phpunit/tests/rest-api/rest-schema-setup.php

    r56819 r57494  
    136136            '/wp/v2/global-styles/(?P<id>[\/\w-]+)',
    137137            '/wp/v2/global-styles/(?P<parent>[\d]+)/revisions',
     138            '/wp/v2/global-styles/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
    138139            '/wp/v2/global-styles/themes/(?P<stylesheet>[\/\s%\w\.\(\)\[\]\@_\-]+)/variations',
    139140            '/wp/v2/global-styles/themes/(?P<stylesheet>[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
  • trunk/tests/qunit/fixtures/wp-api-generated.js

    r57044 r57494  
    1004510045            ]
    1004610046        },
     10047        "/wp/v2/global-styles/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
     10048            "namespace": "wp/v2",
     10049            "methods": [
     10050                "GET"
     10051            ],
     10052            "endpoints": [
     10053                {
     10054                    "methods": [
     10055                        "GET"
     10056                    ],
     10057                    "args": {
     10058                        "parent": {
     10059                            "description": "The ID for the parent of the global styles revision.",
     10060                            "type": "integer",
     10061                            "required": false
     10062                        },
     10063                        "id": {
     10064                            "description": "Unique identifier for the global styles revision.",
     10065                            "type": "integer",
     10066                            "required": false
     10067                        },
     10068                        "context": {
     10069                            "description": "Scope under which the request is made; determines fields present in response.",
     10070                            "type": "string",
     10071                            "enum": [
     10072                                "view",
     10073                                "embed",
     10074                                "edit"
     10075                            ],
     10076                            "default": "view",
     10077                            "required": false
     10078                        }
     10079                    }
     10080                }
     10081            ]
     10082        },
    1004710083        "/wp/v2/global-styles/themes/(?P<stylesheet>[\\/\\s%\\w\\.\\(\\)\\[\\]\\@_\\-]+)/variations": {
    1004810084            "namespace": "wp/v2",
Note: See TracChangeset for help on using the changeset viewer.