-
Notifications
You must be signed in to change notification settings - Fork 800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Connection: Add REST support for jsonAPI endpoints #39432
base: trunk
Are you sure you want to change the base?
Changes from 3 commits
3a60d13
9b85565
36368f0
61b021e
8bfbadb
6357e97
9b5e5ae
20974a0
52fe990
549e826
a3cc273
0d757d3
4aaa656
40eec5f
b4836df
ab97174
9ba813f
bb92f7a
3db7335
9b3202f
2e1ae27
8abca0d
e97dd90
79fdce8
22e01d7
01a8fbc
a0ec6ce
541cbe3
8013673
b2b467a
b9faed5
eb68e2c
d2a9835
bbb226a
debee21
95e1279
2b2ff8c
a4806b7
9d6f78a
9739eaa
4850259
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
Significance: minor | ||
Type: other | ||
|
||
Add REST support for jsonAPI endpoints. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ | |
*/ | ||
|
||
use Automattic\Jetpack\Connection\Client; | ||
use Automattic\Jetpack\Connection\Manager; | ||
use Automattic\Jetpack\Status; | ||
|
||
require_once __DIR__ . '/json-api-config.php'; | ||
|
@@ -124,6 +125,13 @@ abstract class WPCOM_JSON_API_Endpoint { | |
*/ | ||
public $path_labels = array(); | ||
|
||
/** | ||
* The REST endpoint if available. | ||
* | ||
* @var bool | ||
*/ | ||
public $rest_route = null; | ||
|
||
/** | ||
* Accepted query parameters | ||
* | ||
|
@@ -277,6 +285,11 @@ abstract class WPCOM_JSON_API_Endpoint { | |
*/ | ||
public $allow_fallback_to_jetpack_blog_token = false; | ||
|
||
/** | ||
* REST namespace. | ||
*/ | ||
const REST_NAMESPACE = 'rest/v1'; | ||
sergeymitr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
/** | ||
* Constructor. | ||
* | ||
|
@@ -300,6 +313,7 @@ public function __construct( $args ) { | |
'new_version' => WPCOM_JSON_API__CURRENT_VERSION, | ||
'jp_disabled' => false, | ||
'path_labels' => array(), | ||
'rest_route' => null, | ||
'request_format' => array(), | ||
'response_format' => array(), | ||
'query_parameters' => array(), | ||
|
@@ -334,6 +348,7 @@ public function __construct( $args ) { | |
$this->method = $args['method']; | ||
$this->path = $args['path']; | ||
$this->path_labels = $args['path_labels']; | ||
$this->rest_route = $args['rest_route']; | ||
$this->min_version = $args['min_version']; | ||
$this->max_version = $args['max_version']; | ||
$this->deprecated = $args['deprecated']; | ||
|
@@ -387,6 +402,10 @@ public function __construct( $args ) { | |
$this->example_response = $args['example_response']; | ||
|
||
$this->api->add( $this ); | ||
|
||
if ( $this->rest_route ) { | ||
$this->create_rest_route_for_endpoint(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should never happen on WPCOM :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In general, it feels like this logic would be better suited to be part of the api, aka There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good catch, I added the "not WPCOM" condition: 9b3202f
The REST endpoint belongs to the endpoint object, so that seems logical to me to let the endpoint object initialize it. |
||
} | ||
} | ||
|
||
/** | ||
|
@@ -2618,6 +2637,43 @@ public function get_amp_cache_origins( $siteurl ) { | |
); | ||
} | ||
|
||
/** | ||
* Register a REST route for this jsonAPI endpoint. | ||
* | ||
* @return void | ||
* @throws Exception The exception if something goes wrong. | ||
*/ | ||
public function create_rest_route_for_endpoint() { | ||
register_rest_route( | ||
static::REST_NAMESPACE, | ||
$this->rest_route, | ||
array( | ||
'methods' => $this->method, | ||
'callback' => array( $this, 'rest_callback' ), | ||
) | ||
); | ||
} | ||
|
||
/** | ||
* Handle the rest call. | ||
* | ||
* @param WP_REST_Request $request The request object. | ||
* | ||
* @return mixed|WP_Error | ||
*/ | ||
public function rest_callback( WP_REST_Request $request ) { | ||
$manager = new Manager( 'jetpack' ); | ||
if ( ! $manager->is_connected() ) { | ||
return new WP_Error( 'site_not_connected' ); | ||
} | ||
|
||
$blog_id = Jetpack_Options::get_option( 'id' ); | ||
return call_user_func_array( | ||
array( $this, 'callback' ), | ||
array_values( array( $this->path, $blog_id ) + $request->get_url_params() ) | ||
); | ||
} | ||
|
||
/** | ||
* Return endpoint response | ||
* | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking that maybe it would make sense to shuffle things a bit so that we make this method consistent with json_api here.