Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
27.78% covered (danger)
27.78%
10 / 36
25.00% covered (danger)
25.00%
1 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Rest_Api_Endpoints
26.47% covered (danger)
26.47%
9 / 34
25.00% covered (danger)
25.00%
1 / 4
33.44
0.00% covered (danger)
0.00%
0 / 1
 register_endpoints
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
2
 get_jitm_message
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
 delete_jitm_message
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 delete_jitm_message_permission_callback
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2/**
3 * JITM's REST API Endpoints
4 *
5 * @package automattic/jetpack-jitm
6 */
7
8namespace Automattic\Jetpack\JITMS;
9
10use Automattic\Jetpack\Connection\REST_Connector;
11use WP_Error;
12use WP_REST_Request;
13use WP_REST_Server;
14
15if ( ! defined( 'ABSPATH' ) ) {
16    exit( 0 );
17}
18
19/**
20 * Register the JITM's REST API Endpoints and their callbacks.
21 */
22class Rest_Api_Endpoints {
23
24    /**
25     * Declare the JITM's REST API endpoints.
26     */
27    public static function register_endpoints() {
28
29        register_rest_route(
30            'jetpack/v4',
31            '/jitm',
32            array(
33                'methods'             => WP_REST_Server::READABLE,
34                'callback'            => __CLASS__ . '::get_jitm_message',
35                'permission_callback' => '__return_true',
36            )
37        );
38
39        register_rest_route(
40            'jetpack/v4',
41            '/jitm',
42            array(
43                'methods'             => WP_REST_Server::CREATABLE,
44                'callback'            => __CLASS__ . '::delete_jitm_message',
45                'permission_callback' => __CLASS__ . '::delete_jitm_message_permission_callback',
46            )
47        );
48    }
49
50    /**
51     * Asks for a jitm, unless they've been disabled, in which case it returns an empty array
52     *
53     * @param WP_REST_Request $request The request object.
54     *
55     * @return array An array of jitms
56     */
57    public static function get_jitm_message( $request ) {
58        $jitm = JITM::get_instance();
59
60        if ( ! $jitm->jitms_enabled() ) {
61            return array();
62        }
63
64        $query_string = $request['query'] ?? '';
65        $query_array  = array();
66        if ( ! empty( $query_string ) ) {
67            parse_str( $query_string, $query_array );
68            $query_array = urldecode_deep( $query_array );
69        }
70
71        return $jitm->get_messages( $request['message_path'], $query_array, 'true' === $request['full_jp_logo_exists'] );
72    }
73
74    /**
75     * Dismisses a jitm.
76     *
77     * @param WP_REST_Request $request The request object.
78     *
79     * @return bool Always True
80     */
81    public static function delete_jitm_message( $request ) {
82        $jitm = JITM::get_instance();
83
84        if ( ! $jitm->jitms_enabled() ) {
85            return true;
86        }
87
88        return $jitm->dismiss( $request['id'], $request['feature_class'] );
89    }
90
91    /**
92     * Verify that the user can dismiss JITM messages.
93     *
94     * @return bool|WP_Error True if user is able to dismiss JITM messages.
95     */
96    public static function delete_jitm_message_permission_callback() {
97        if ( current_user_can( 'read' ) ) {
98            return true;
99        }
100
101        return new WP_Error( 'invalid_user_permission_jetpack_delete_jitm_message', REST_Connector::get_user_permissions_error_msg(), array( 'status' => rest_authorization_required_code() ) );
102    }
103}