Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
28.57% covered (danger)
28.57%
18 / 63
50.00% covered (danger)
50.00%
2 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
WP_REST_Agents_Manager_Persisted_Open_State
28.57% covered (danger)
28.57%
18 / 63
50.00% covered (danger)
50.00%
2 / 4
46.44
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 register_rest_route
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
1
 get_state
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
12
 set_state
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 * WP_REST_Agents_Manager_Persisted_Open_State file.
4 *
5 * @package automattic/jetpack-mu-wpcom
6 */
7
8namespace A8C\FSE;
9
10use Automattic\Jetpack\Connection\Client;
11
12/**
13 * Class WP_REST_Agents_Manager_Persisted_Open_State.
14 */
15class WP_REST_Agents_Manager_Persisted_Open_State extends \WP_REST_Controller {
16
17    /**
18     * WP_REST_Agents_Manager_Persisted_Open_State constructor.
19     */
20    public function __construct() {
21        $this->namespace = 'agents-manager';
22        $this->rest_base = '/open-state';
23    }
24
25    /**
26     * Register available routes.
27     */
28    public function register_rest_route() {
29        register_rest_route(
30            $this->namespace,
31            $this->rest_base,
32            array(
33                // Get the open state.
34                array(
35                    'methods'             => \WP_REST_Server::READABLE,
36                    'callback'            => array( $this, 'get_state' ),
37                    'permission_callback' => 'is_user_logged_in',
38                ),
39                // Set the open state
40                array(
41                    'methods'             => \WP_REST_Server::EDITABLE,
42                    'callback'            => array( $this, 'set_state' ),
43                    'permission_callback' => 'is_user_logged_in',
44                ),
45            )
46        );
47    }
48
49    /**
50     * Default state values.
51     */
52    private const DEFAULTS = array(
53        'agents_manager_open'              => false,
54        'agents_manager_docked'            => false,
55        'agents_manager_floating_position' => 'right',
56        'agents_manager_router_history'    => null,
57    );
58
59    /**
60     * Get Agents Manager state from user preferences.
61     *
62     * Uses the dedicated wpcom/v2/agents-manager/state endpoint
63     * which only exposes the specific preferences needed.
64     */
65    public function get_state() {
66        $body = Client::wpcom_json_api_request_as_user(
67            '/agents-manager/state',
68            '2',
69            array( 'method' => 'GET' )
70        );
71
72        if ( is_wp_error( $body ) ) {
73            return $body;
74        }
75
76        $response = json_decode( wp_remote_retrieve_body( $body ), true );
77
78        if ( ! is_array( $response ) ) {
79            return rest_ensure_response( self::DEFAULTS );
80        }
81
82        return rest_ensure_response(
83            array(
84                'agents_manager_open'              => (bool) ( $response['agents_manager_open'] ?? self::DEFAULTS['agents_manager_open'] ),
85                'agents_manager_docked'            => (bool) ( $response['agents_manager_docked'] ?? self::DEFAULTS['agents_manager_docked'] ),
86                'agents_manager_floating_position' => $response['agents_manager_floating_position'] ?? self::DEFAULTS['agents_manager_floating_position'],
87                'agents_manager_router_history'    => $response['agents_manager_router_history'] ?? self::DEFAULTS['agents_manager_router_history'],
88            )
89        );
90    }
91
92    /**
93     * Set Agents Manager state in user preferences.
94     *
95     * Uses the dedicated wpcom/v2/agents-manager/state endpoint
96     * which only allows updating the specific preferences needed.
97     *
98     * @param \WP_REST_Request $request The request sent to the API.
99     */
100    public function set_state( \WP_REST_Request $request ) {
101        $state = array();
102
103        foreach ( array_keys( self::DEFAULTS ) as $key ) {
104            if ( $request->has_param( $key ) ) {
105                $state[ $key ] = $request[ $key ];
106            }
107        }
108
109        $body = Client::wpcom_json_api_request_as_user(
110            '/agents-manager/state',
111            '2',
112            array( 'method' => 'POST' ),
113            array( 'state' => $state )
114        );
115
116        if ( is_wp_error( $body ) ) {
117            return $body;
118        }
119
120        $response = json_decode( wp_remote_retrieve_body( $body ), true );
121
122        if ( ! is_array( $response ) ) {
123            return new \WP_Error(
124                'invalid_response',
125                'Invalid response from WPCOM endpoint',
126                array( 'status' => 500 )
127            );
128        }
129
130        return rest_ensure_response(
131            array(
132                'agents_manager_open'              => (bool) ( $response['agents_manager_open'] ?? self::DEFAULTS['agents_manager_open'] ),
133                'agents_manager_docked'            => (bool) ( $response['agents_manager_docked'] ?? self::DEFAULTS['agents_manager_docked'] ),
134                'agents_manager_floating_position' => $response['agents_manager_floating_position'] ?? self::DEFAULTS['agents_manager_floating_position'],
135                'agents_manager_router_history'    => $response['agents_manager_router_history'] ?? self::DEFAULTS['agents_manager_router_history'],
136            )
137        );
138    }
139}