Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 75
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
REST_Settings_Controller
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 5
182
0.00% covered (danger)
0.00%
0 / 1
 register_routes
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
2
 get_settings
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 update_settings
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
30
 settings_permissions_callback
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 get_item_schema
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Class used to register REST API settings endpoints used by Social Image Generator.
4 *
5 * Flagged to be removed after deprecation.
6 *
7 * @deprecated 0.38.3
8 *
9 * @package automattic/jetpack-publicize
10 */
11
12namespace Automattic\Jetpack\Publicize\Social_Image_Generator;
13
14use Automattic\Jetpack\Publicize\Jetpack_Social_Settings\Settings as Jetpack_Social_Settings;
15use WP_Error;
16use WP_REST_Controller;
17use WP_REST_Request;
18use WP_REST_Response;
19use WP_REST_Server;
20
21if ( ! defined( 'ABSPATH' ) ) {
22    exit( 0 );
23}
24
25/**
26 * Defines our endpoints.
27 */
28class REST_Settings_Controller extends WP_REST_Controller {
29    /**
30     * Register REST API endpoints.
31     *
32     * @return void
33     */
34    public function register_routes() {
35        register_rest_route(
36            'jetpack/v4',
37            '/social-image-generator/settings',
38            array(
39                array(
40                    'methods'             => WP_REST_Server::READABLE,
41                    'callback'            => array( $this, 'get_settings' ),
42                    'permission_callback' => array( $this, 'settings_permissions_callback' ),
43                ),
44                array(
45                    'methods'             => WP_REST_Server::CREATABLE,
46                    'callback'            => array( $this, 'update_settings' ),
47                    'permission_callback' => array( $this, 'settings_permissions_callback' ),
48                    'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
49                ),
50                'schema' => array( $this, 'get_public_item_schema' ),
51            )
52        );
53    }
54
55    /**
56     * GET `/jetpack/v4/social-image-generator/settings`
57     *
58     * @return WP_REST_Response
59     */
60    public function get_settings() {
61        $settings   = ( new Jetpack_Social_Settings() )->get_settings();
62        $response   = array();
63        $schema     = $this->get_item_schema();
64        $properties = array_keys( $schema['properties'] );
65
66        if ( in_array( 'enabled', $properties, true ) ) {
67            $response['enabled'] = $settings['socialImageGeneratorSettings']['enabled'];
68        }
69
70        if ( in_array( 'default_image_id', $properties, true ) ) {
71            $response['default_image_id'] = $settings['socialImageGeneratorSettings']['default_image_id'];
72        }
73
74        if ( in_array( 'defaults', $properties, true ) ) {
75            $response['defaults'] = array( 'template' => $settings['socialImageGeneratorSettings']['template'] );
76        }
77
78        return rest_ensure_response( $response );
79    }
80
81    /**
82     * POST `/jetpack/v4/social-image-generator/settings`
83     *
84     * @param WP_REST_Request $request The API request.
85     *
86     * @return WP_REST_Response|WP_Error
87     */
88    public function update_settings( $request ) {
89        $settings = new Jetpack_Social_Settings();
90
91        if ( isset( $request['enabled'] ) ) {
92            $settings->update_social_image_generator_settings( array( 'enabled' => $request['enabled'] ) );
93        }
94
95        if ( isset( $request['default_image_id'] ) ) {
96            $settings->update_social_image_generator_settings( array( 'default_image_id' => $request['default_image_id'] ) );
97        }
98
99        if ( $request['defaults'] && $request['defaults']['template'] ) {
100            $settings->update_social_image_generator_settings( array( 'template' => $request['defaults']['template'] ) );
101        }
102
103        return rest_ensure_response( $this->get_settings() );
104    }
105
106    /**
107     * Check the permissions for accessing and updating the settings endpoint.
108     *
109     * @return bool|WP_Error True if user can manage options.
110     */
111    public function settings_permissions_callback() {
112        if ( ! current_user_can( 'manage_options' ) ) {
113            return new WP_Error(
114                'rest_forbidden_context',
115                __( 'Sorry, you are not allowed to access this endpoint.', 'jetpack-publicize-pkg' ),
116                array( 'status' => rest_authorization_required_code() )
117            );
118        }
119
120        return true;
121    }
122
123    /**
124     * Retrieves the Social Image Generator's settings schema, conforming to JSON Schema.
125     *
126     * @return array Schema data.
127     */
128    public function get_item_schema() {
129        $schema = array(
130            '$schema'    => 'http://json-schema.org/draft-04/schema#',
131            'title'      => 'social-image-generator-settings',
132            'type'       => 'object',
133            'properties' => array(
134                'enabled'          => array(
135                    'description' => __( 'Whether or not Social Image Generator is enabled.', 'jetpack-publicize-pkg' ),
136                    'type'        => 'boolean',
137                    'context'     => array( 'view', 'edit' ),
138                ),
139                'default_image_id' => array(
140                    'description' => __( 'The default image ID for the Social Image Generator.', 'jetpack-publicize-pkg' ),
141                    'type'        => 'number',
142                    'context'     => array( 'view', 'edit' ),
143                ),
144                'defaults'         => array(
145                    'description' => __( 'The default settings for a new generated image.', 'jetpack-publicize-pkg' ),
146                    'type'        => 'object',
147                    'context'     => array( 'view', 'edit' ),
148                    'properties'  => array(
149                        'template' => array(
150                            'type' => 'string',
151                            'enum' => Templates::TEMPLATES,
152                        ),
153                    ),
154                ),
155            ),
156        );
157
158        return rest_default_additional_properties_to_false( $schema );
159    }
160}