Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
33.01% covered (danger)
33.01%
34 / 103
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
WPCOM_REST_API_V2_Endpoint_Mailchimp
34.00% covered (danger)
34.00%
34 / 100
0.00% covered (danger)
0.00%
0 / 6
147.79
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 register_routes
97.14% covered (success)
97.14%
34 / 35
0.00% covered (danger)
0.00%
0 / 1
1
 is_connected
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
20
 get_mailchimp_status
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
30
 get_mailchimp_groups
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
30
 get_mailchimp_settings
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 * API endpoints to interact with WordPress.com
4 * to get info from the Mailchimp API for use with the Mailchimp block.
5 *
6 * @package automattic/jetpack
7 */
8
9use Automattic\Jetpack\Connection\Client;
10use Automattic\Jetpack\Connection\Manager as Connection_Manager;
11use Automattic\Jetpack\Status\Host;
12
13if ( ! defined( 'ABSPATH' ) ) {
14    exit( 0 );
15}
16
17/**
18 * Mailchimp: Get Mailchimp Status.
19 * API to determine if current site has linked Mailchimp account and mailing list selected.
20 * This API is meant to be used in Jetpack and on WPCOM.
21 *
22 * @since 7.1
23 */
24class WPCOM_REST_API_V2_Endpoint_Mailchimp extends WP_REST_Controller {
25    /**
26     * Constructor.
27     */
28    public function __construct() {
29        $this->namespace                    = 'wpcom/v2';
30        $this->rest_base                    = 'mailchimp';
31        $this->wpcom_is_wpcom_only_endpoint = true;
32
33        add_action( 'rest_api_init', array( $this, 'register_routes' ) );
34    }
35
36    /**
37     * Called automatically on `rest_api_init()`.
38     */
39    public function register_routes() {
40        register_rest_route(
41            $this->namespace,
42            $this->rest_base,
43            array(
44                array(
45                    'methods'             => WP_REST_Server::READABLE,
46                    'callback'            => array( $this, 'get_mailchimp_status' ),
47                    'permission_callback' => '__return_true',
48                ),
49            )
50        );
51        register_rest_route(
52            $this->namespace,
53            $this->rest_base . '/groups',
54            array(
55                array(
56                    'methods'             => WP_REST_Server::READABLE,
57                    'callback'            => array( $this, 'get_mailchimp_groups' ),
58                    'permission_callback' => '__return_true',
59                ),
60            )
61        );
62        register_rest_route(
63            $this->namespace,
64            $this->rest_base . '/settings',
65            array(
66                array(
67                    'methods'             => WP_REST_Server::READABLE,
68                    'callback'            => array( $this, 'get_mailchimp_settings' ),
69                    'permission_callback' => function () {
70                        return current_user_can( 'manage_options' );
71                    },
72                ),
73            )
74        );
75    }
76
77    /**
78     * Check if MailChimp is set up properly.
79     *
80     * @return bool
81     */
82    private function is_connected() {
83        $option = get_option( 'jetpack_mailchimp' );
84        if ( ! $option ) {
85            return false;
86        }
87        $data = json_decode( $option, true );
88        if ( ! $data ) {
89            return false;
90        }
91        return isset( $data['follower_list_id'] ) && isset( $data['keyring_id'] );
92    }
93
94    /**
95     * Get the status of current blog's Mailchimp connection
96     *
97     * @return mixed
98     * code:string (connected|unconnected),
99     * connect_url:string
100     * site_id:int
101     */
102    public function get_mailchimp_status() {
103        $is_wpcom = ( defined( 'IS_WPCOM' ) && IS_WPCOM );
104        $site_id  = $is_wpcom ? get_current_blog_id() : Jetpack_Options::get_option( 'id' );
105        if ( ! $site_id ) {
106            return new WP_Error(
107                'unavailable_site_id',
108                __( 'Sorry, something is wrong with your Jetpack connection.', 'jetpack' ),
109                403
110            );
111        }
112        $connect_url = '/wp-admin/options-writing.php';
113        return array(
114            'code'        => $this->is_connected() ? 'connected' : 'not_connected',
115            'connect_url' => $connect_url,
116            'site_id'     => $site_id,
117        );
118    }
119
120    /**
121     * Get all Mailchimp groups for the accounted connected to the current blog
122     *
123     * @return mixed
124     * groups:array
125     * site_id:int
126     */
127    public function get_mailchimp_groups() {
128        $is_wpcom = ( defined( 'IS_WPCOM' ) && IS_WPCOM );
129        $site_id  = $is_wpcom ? get_current_blog_id() : Jetpack_Options::get_option( 'id' );
130        if ( ! $site_id ) {
131            return new WP_Error(
132                'unavailable_site_id',
133                __( 'Sorry, something is wrong with your Jetpack connection.', 'jetpack' ),
134                403
135            );
136        }
137
138        // Do not attempt to fetch groups if Mailchimp is not connected.
139        if ( ! $this->is_connected() ) {
140            return new WP_Error(
141                'mailchimp_not_connected',
142                __( 'Your site is not connected to Mailchimp yet.', 'jetpack' ),
143                403
144            );
145        }
146
147        $path    = sprintf( '/sites/%d/mailchimp/groups', absint( $site_id ) );
148        $request = Client::wpcom_json_api_request_as_blog( $path );
149        $body    = wp_remote_retrieve_body( $request );
150        return json_decode( $body );
151    }
152
153    /**
154     * Get the Mailchimp connection settings.
155     *
156     * @return mixed
157     */
158    public function get_mailchimp_settings() {
159        $site_id = Connection_Manager::get_site_id();
160        if ( is_wp_error( $site_id ) ) {
161            return new WP_Error(
162                'unavailable_site_id',
163                __( 'Sorry, something is wrong with your Jetpack connection.', 'jetpack' ),
164                403
165            );
166        }
167
168        $settings = array();
169
170        if ( ( new Host() )->is_wpcom_simple() ) {
171            require_lib( 'mailchimp' );
172            $api                   = new MailchimpApi( $site_id, get_current_user_id() );
173            $settings              = $api::get_settings( $site_id );
174            $settings['audiences'] = $api->get_lists();
175        } else {
176            $path     = sprintf( '/sites/%d/mailchimp/settings', $site_id );
177            $response = Client::wpcom_json_api_request_as_user( $path, '1.1', array(), null, 'rest' );
178            if ( ! is_wp_error( $response ) ) {
179                $settings = json_decode( wp_remote_retrieve_body( $response ), true );
180            }
181
182            $path     = sprintf( '/sites/%d/mailchimp/lists', $site_id );
183            $response = Client::wpcom_json_api_request_as_user( $path, '1.1', array(), null, 'rest' );
184            if ( ! is_wp_error( $response ) ) {
185                $settings['audiences'] = json_decode( wp_remote_retrieve_body( $response ), true );
186            }
187        }
188
189        return $settings;
190    }
191}
192
193wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_Mailchimp' );