This commit is contained in:
2026-07-02 15:54:39 -06:00
commit 9883323161
17470 changed files with 4470592 additions and 0 deletions
@@ -0,0 +1,44 @@
<?php
/**
* Package description here
*
* @package automattic/jetpack-explat
*/
namespace Automattic\Jetpack;
use Automattic\Jetpack\Connection\Rest_Authentication;
use Automattic\Jetpack\ExPlat\REST_Controller;
/**
* Class description.
*/
class ExPlat {
/**
* ExPlat package version
*
* @var string
*/
const PACKAGE_VERSION = '0.4.33';
/**
* Initializer.
* Used to configure the ExPlat package
*
* @return void
*/
public static function init() {
if ( did_action( 'jetpack_explat_initialized' ) ) {
return;
}
// Set up the REST authentication hooks.
Rest_Authentication::init();
add_action( 'rest_api_init', array( REST_Controller::class, 'register' ) );
// Runs right after the Jetpack ExPlat package is initialized.
do_action( 'jetpack_explat_initialized' );
}
}
@@ -0,0 +1,144 @@
<?php
/**
* The ExPlat Rest Controller class.
* Registers the REST routes for ExPlat backend
*
* @package automattic/jetpack-explat
*/
namespace Automattic\Jetpack\ExPlat;
use Automattic\Jetpack\Connection\Client;
use Automattic\Jetpack\Connection\Manager as Jetpack_Connection;
use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
/**
* Registers general REST routes for ExPlat.
*/
class REST_Controller {
/**
* Namespace for the REST API.
*
* @var string
*/
public static $namespace = 'jetpack/v4/explat';
/**
* Current version of the ExPlat API and components
*
* @var string
*/
const EXPLAT_API_VERSION = '0.1.0';
/**
* Base API URI for WordPress.com
*
* @var string
*/
const WPCOM_API_BASE_URL = 'https://public-api.wordpress.com/wpcom/v2';
/**
* Registers the REST routes on the `rest_api_init` hook.
*
* Instantiated here, rather than eagerly, so the controller class only loads
* on requests that reach `rest_api_init`. Static so the callback can be
* unregistered.
*
* @access public
*/
public static function register() {
( new self() )->register_rest_routes();
}
/**
* Registers the REST routes.
*
* @access public
* @static
*/
public function register_rest_routes() {
register_rest_route(
static::$namespace,
'assignments',
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_assignments' ),
'permission_callback' => '__return_true',
'args' => array(
'experiment_name' => array(
'type' => 'string',
),
'anon_id' => array(
'type' => 'string',
),
'as_connected_user' => array(
'type' => 'boolean',
),
'platform' => array(
'type' => 'string',
'enum' => array( 'jetpack', 'calypso', 'wpcom' ),
'default' => 'jetpack',
),
),
)
);
}
/**
* Get the assignments for a given experiment and anon_id
*
* @param WP_REST_Request $request The REST request object.
* @return WP_REST_Response|WP_Error
*/
public function get_assignments( $request ) {
$response = null;
$is_user_connected = ( new Jetpack_Connection() )->is_user_connected();
$platform = $request->get_param( 'platform' );
$request_path = '/experiments/' . self::EXPLAT_API_VERSION . '/assignments/' . $platform;
$args = array(
'experiment_names' => $request['experiment_name'],
'anon_id' => $request['anon_id'],
);
if ( $request['as_connected_user'] && $is_user_connected ) {
$response = Client::wpcom_json_api_request_as_user(
add_query_arg( $args, $request_path ),
'v2',
array(
'headers' => array(
'User-Agent' => 'Jetpack MU WPCOM Plugin Experiment Assignment',
),
)
);
} else {
$response = wp_remote_get(
add_query_arg( $args, self::WPCOM_API_BASE_URL . $request_path )
);
}
if ( is_wp_error( $response ) ) {
return new WP_Error(
'wp_error_fetching_assignment',
$response->get_error_message(),
array( 'status' => 500 )
);
}
$response_code = wp_remote_retrieve_response_code( $response );
if ( 200 !== $response_code ) {
return new WP_Error(
'http_error_fetching_assignment',
wp_remote_retrieve_response_message( $response ),
array( 'status' => $response_code )
);
}
return rest_ensure_response(
json_decode( wp_remote_retrieve_body( $response ), true )
);
}
}