oont-contents/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-my-jetpack/src/class-rest-zendesk-chat.php
2025-02-08 15:10:23 +01:00

122 lines
3.7 KiB
PHP

<?php
/**
* Sets up the Zendesk Chat REST API endpoints.
*
* @package automattic/my-jetpack
*/
namespace Automattic\Jetpack\My_Jetpack;
use Automattic\Jetpack\Connection\Client;
use WP_Error;
use WP_REST_Response;
/**
* Registers the REST routes for Zendesk Chat.
*/
class REST_Zendesk_Chat {
const TRANSIENT_EXPIRY = 1 * MINUTE_IN_SECONDS * 60 * 24 * 7; // 1 week (JWT is actually 2 weeks, but lets be on the safe side)
const ZENDESK_AUTH_TOKEN = 'zendesk_auth_token';
/**
* Constructor.
*/
public function __construct() {
register_rest_route(
'my-jetpack/v1',
'chat/availability',
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => __CLASS__ . '::get_chat_availability',
'permission_callback' => __CLASS__ . '::chat_authentication_permissions_callback',
)
);
register_rest_route(
'my-jetpack/v1',
'chat/authentication',
array(
'methods' => \WP_REST_Server::READABLE,
'callback' => __CLASS__ . '::get_chat_authentication',
'args' => array(
'type' => array(
'required' => false,
'type' => 'string',
),
'test_mode' => array(
'required' => false,
'type' => 'boolean',
),
),
'permission_callback' => __CLASS__ . '::chat_authentication_permissions_callback',
)
);
}
/**
* Ensure user is logged in if making an authentication request
*
* @access public
* @static
*
* @return WP_Error|true
*/
public static function chat_authentication_permissions_callback() {
if ( ! get_current_user_id() ) {
return new WP_Error( 'unauthorized', 'You must be logged in to access this resource.', array( 'status' => 401 ) );
}
return true;
}
/**
* Gets the chat authentication token.
*
* @return WP_Error|WP_REST_Response { token: string }
*/
public static function get_chat_authentication() {
$authentication = get_transient( self::ZENDESK_AUTH_TOKEN );
if ( $authentication ) {
return rest_ensure_response( $authentication, 200 );
}
$proxied = function_exists( 'wpcom_is_proxied_request' ) ? wpcom_is_proxied_request() : false;
$wpcom_endpoint = 'help/authenticate/chat';
$wpcom_api_version = '2';
$body = array(
'type' => 'zendesk',
'test_mode' => $proxied ? true : false,
);
$response = Client::wpcom_json_api_request_as_user( $wpcom_endpoint, $wpcom_api_version, array( 'method' => 'POST' ), $body );
$response_code = wp_remote_retrieve_response_code( $response );
$body = json_decode( wp_remote_retrieve_body( $response ) );
if ( is_wp_error( $response ) || empty( $response['body'] ) ) {
return new WP_Error( 'chat_authentication_failed', 'Chat authentication failed', array( 'status' => $response_code ) );
}
set_transient( self::ZENDESK_AUTH_TOKEN, $body, self::TRANSIENT_EXPIRY );
return rest_ensure_response( $body, 200 );
}
/**
* Calls `wpcom/v2/presales/chat?group=jp_presales` endpoint.
* This endpoint returns whether or not the Jetpack presales chat group is available
*
* @return WP_Error|WP_REST_Response { is_available: bool }
*/
public static function get_chat_availability() {
$wpcom_endpoint = '/presales/chat?group=jp_presales';
$wpcom_api_version = '2';
$response = Client::wpcom_json_api_request_as_user( $wpcom_endpoint, $wpcom_api_version );
$response_code = wp_remote_retrieve_response_code( $response );
$body = json_decode( wp_remote_retrieve_body( $response ) );
if ( is_wp_error( $response ) || empty( $response['body'] ) ) {
return new WP_Error( 'chat_config_data_fetch_failed', 'Chat config data fetch failed', array( 'status' => $response_code ) );
}
return rest_ensure_response( $body, 200 );
}
}