Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.98% covered (warning)
85.98%
92 / 107
60.00% covered (warning)
60.00%
3 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
Social_Image_Generator_Controller
86.67% covered (warning)
86.67%
91 / 105
60.00% covered (warning)
60.00%
3 / 5
9.19
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 register_routes
100.00% covered (success)
100.00%
71 / 71
100.00% covered (success)
100.00%
1 / 1
1
 permissions_check
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
3.21
 generate_preview_token
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 get_font_options
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2/**
3 * Publicize: Social Image Generator Controller
4 *
5 * @package automattic/jetpack-publicize
6 */
7
8namespace Automattic\Jetpack\Publicize\REST_API;
9
10use Automattic\Jetpack\Connection\Traits\WPCOM_REST_API_Proxy_Request;
11use Automattic\Jetpack\Publicize\Publicize_Utils as Utils;
12use Automattic\Jetpack\Publicize\Social_Image_Generator as SIG;
13use Automattic\Jetpack\Publicize\Social_Image_Generator\Templates;
14use WP_Error;
15use WP_REST_Request;
16use WP_REST_Response;
17use WP_REST_Server;
18
19if ( ! defined( 'ABSPATH' ) ) {
20    exit( 0 );
21}
22
23/**
24 * Publicize: Social Image Generator Controller class.
25 *
26 * @phan-constructor-used-for-side-effects
27 */
28class Social_Image_Generator_Controller extends Base_Controller {
29
30    use WPCOM_REST_API_Proxy_Request;
31
32    /**
33     * The constructor sets the route namespace, rest_base, and registers our API route and endpoint.
34     */
35    public function __construct() {
36        parent::__construct();
37
38        $this->base_api_path = 'wpcom';
39        $this->version       = 'v2';
40
41        $this->namespace = "{$this->base_api_path}/{$this->version}";
42        $this->rest_base = 'publicize/social-image-generator';
43
44        $this->allow_requests_as_blog = true;
45
46        add_action( 'rest_api_init', array( $this, 'register_routes' ) );
47    }
48
49    /**
50     * Register the routes.
51     */
52    public function register_routes() {
53        register_rest_route(
54            $this->namespace,
55            '/' . $this->rest_base . '/generate-token',
56            array(
57                'methods'                        => WP_REST_Server::CREATABLE,
58                'callback'                       => array( $this, 'generate_preview_token' ),
59                'permission_callback'            => array( $this, 'permissions_check' ),
60                'private_site_security_settings' => array(
61                    'allow_blog_token_access' => true,
62                ),
63                'args'                           => array(
64                    'text'      => array(
65                        'description' => __( 'The text to be used to generate the image.', 'jetpack-publicize-pkg' ),
66                        'type'        => 'string',
67                        'required'    => true,
68                    ),
69                    'image_url' => array(
70                        'description' => __( 'The URL of the background image to use when generating the social image.', 'jetpack-publicize-pkg' ),
71                        'oneOf'       => array(
72                            array(
73                                'type' => 'string',
74                            ),
75                            array(
76                                'type' => 'null',
77                            ),
78                        ),
79                    ),
80                    'template'  => array(
81                        'description' => __( 'The template slug.', 'jetpack-publicize-pkg' ),
82                        'type'        => 'string',
83                        'enum'        => Templates::TEMPLATES,
84                    ),
85                    'font'      => array(
86                        'description' => __( 'The font slug.', 'jetpack-publicize-pkg' ),
87                        'type'        => 'string',
88                    ),
89                ),
90                'schema'                         => array(
91                    '$schema' => 'http://json-schema.org/draft-04/schema#',
92                    'title'   => 'publicize-sig-generate-token',
93                    'type'    => 'string',
94                ),
95            )
96        );
97
98        register_rest_route(
99            $this->namespace,
100            '/' . $this->rest_base . '/font-options',
101            array(
102                'methods'             => WP_REST_Server::READABLE,
103                'callback'            => array( $this, 'get_font_options' ),
104                'permission_callback' => array( $this, 'permissions_check' ),
105                'schema'              => array(
106                    '$schema' => 'http://json-schema.org/draft-04/schema#',
107                    'title'   => 'publicize-sig-font-options',
108                    'type'    => 'array',
109                    'items'   => array(
110                        'type'       => 'object',
111                        'properties' => array(
112                            'id'    => array(
113                                'type'        => 'string',
114                                'description' => __( 'Unique identifier for the font.', 'jetpack-publicize-pkg' ),
115                            ),
116                            'label' => array(
117                                'type'        => 'string',
118                                'description' => __( 'The font label.', 'jetpack-publicize-pkg' ),
119                            ),
120                        ),
121                    ),
122                ),
123            )
124        );
125    }
126
127    /**
128     * Ensure the user has proper permissions.
129     *
130     * @return boolean|WP_Error True if the user has permissions, WP_Error otherwise.
131     */
132    public function permissions_check() {
133        $permissions = $this->publicize_permissions_check();
134
135        if ( is_wp_error( $permissions ) ) {
136            return $permissions;
137        }
138
139        // On WPCOM, need to check for the feature.
140        if ( Utils::is_wpcom() ) {
141            require_lib( 'publicize/util/social-image-generator' );
142
143            return \Publicize\Social_Image_Generator\is_enabled();
144        }
145
146        return true;
147    }
148
149    /**
150     * Passes the request parameters to the WPCOM endpoint to generate a preview image token.
151     *
152     * @param WP_REST_Request $request The request object, which includes the parameters.
153     * @return WP_REST_Response The response.
154     */
155    public function generate_preview_token( $request ) {
156        return rest_ensure_response(
157            SIG\fetch_token(
158                $request->get_param( 'text' ),
159                $request->get_param( 'image_url' ),
160                $request->get_param( 'template' ),
161                $request->get_param( 'font' )
162            )
163        );
164    }
165
166    /**
167     * Returns the available font options for the social image generator.
168     *
169     * @param WP_REST_Request $request The request object, which includes the parameters.
170     *
171     * @return WP_REST_Response The response containing the font options.
172     */
173    public function get_font_options( $request ) {
174        if ( Utils::is_wpcom() ) {
175            require_lib( 'publicize/util/social-image-generator' );
176
177            $fonts = \Publicize\Social_Image_Generator\get_font_options();
178
179            $font_options = array();
180
181            foreach ( $fonts as $id => [ 'label' => $label ] ) {
182                $font_options[] = compact( 'id', 'label' );
183            }
184
185            return rest_ensure_response( $font_options );
186        }
187
188        $response = $this->proxy_request_to_wpcom_as_blog(
189            $request,
190            'font-options'
191        );
192
193        return rest_ensure_response( $response );
194    }
195}