Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 199
0.00% covered (danger)
0.00%
0 / 12
CRAP
0.00% covered (danger)
0.00%
0 / 1
SiteGenController
0.00% covered (danger)
0.00%
0 / 199
0.00% covered (danger)
0.00%
0 / 12
600
0.00% covered (danger)
0.00%
0 / 1
 register_routes
0.00% covered (danger)
0.00%
0 / 67
0.00% covered (danger)
0.00%
0 / 1
2
 sitegen_meta_args
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
2
 get_homepages_args
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 get_publish_sitemap_pages_args
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 get_regenerate_homepage_args
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
2
 get_enabled_identifiers
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 generate_sitegen_meta
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
6
 get_homepages
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
30
 regenerate_homepage
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
30
 publish_sitemap_pages
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
20
 get_site_details_meta
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 get_customize_sidebar_data
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace NewfoldLabs\WP\Module\Onboarding\RestApi;
4
5use NewfoldLabs\WP\Module\Onboarding\Permissions;
6use NewfoldLabs\WP\Module\Onboarding\Data\Services\SiteGenService;
7use NewfoldLabs\WP\Module\Onboarding\Data\SiteGen as SiteGenData;
8
9/**
10 * Class SiteGenController
11 */
12class SiteGenController {
13
14    /**
15     * The namespace of this controller's route.
16     *
17     * @var string
18     */
19    protected $namespace = 'newfold-onboarding/v1';
20
21    /**
22     * The endpoint base
23     *
24     * @var string
25     */
26    protected $rest_base = '/sitegen';
27
28    /**
29     * Registers rest routes for SiteGenController class.
30     *
31     * @return void
32     */
33    public function register_routes() {
34        \register_rest_route(
35            $this->namespace,
36            $this->rest_base . '/identifiers',
37            array(
38                'methods'             => \WP_REST_Server::READABLE,
39                'callback'            => array( $this, 'get_enabled_identifiers' ),
40                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
41            )
42        );
43        \register_rest_route(
44            $this->namespace,
45            $this->rest_base . '/generate',
46            array(
47                'methods'             => \WP_REST_Server::CREATABLE,
48                'callback'            => array( $this, 'generate_sitegen_meta' ),
49                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
50                'args'                => $this->sitegen_meta_args(),
51            )
52        );
53        \register_rest_route(
54            $this->namespace,
55            $this->rest_base . '/homepages',
56            array(
57                'methods'             => \WP_REST_Server::CREATABLE,
58                'callback'            => array( $this, 'get_homepages' ),
59                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
60                'args'                => $this->get_homepages_args(),
61            )
62        );
63        \register_rest_route(
64            $this->namespace,
65            $this->rest_base . '/homepages/regenerate',
66            array(
67                'methods'             => \WP_REST_Server::CREATABLE,
68                'callback'            => array( $this, 'regenerate_homepage' ),
69                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
70                'args'                => $this->get_regenerate_homepage_args(),
71            )
72        );
73        \register_rest_route(
74            $this->namespace,
75            $this->rest_base . '/site-details-meta',
76            array(
77                'methods'             => \WP_REST_Server::READABLE,
78                'callback'            => array( $this, 'get_site_details_meta' ),
79                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
80            )
81        );
82        \register_rest_route(
83            $this->namespace,
84            $this->rest_base . '/customize-data',
85            array(
86                'methods'             => \WP_REST_Server::READABLE,
87                'callback'            => array( $this, 'get_customize_sidebar_data' ),
88                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
89            )
90        );
91
92        \register_rest_route(
93            $this->namespace,
94            $this->rest_base . '/pages/sitemap',
95            array(
96                'methods'             => \WP_REST_Server::CREATABLE,
97                'callback'            => array( $this, 'publish_sitemap_pages' ),
98                'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
99                'args'                => $this->get_publish_sitemap_pages_args(),
100            )
101        );
102    }
103
104    /**
105     * Required Args for Generating Site Gen Meta.
106     *
107     * @return array
108     */
109    public function sitegen_meta_args() {
110        return array(
111            'site_info'  => array(
112                'required' => true,
113                'type'     => 'object',
114            ),
115            'identifier' => array(
116                'required' => true,
117                'type'     => 'string',
118            ),
119            'locale'     => array(
120                'required' => true,
121                'type'     => 'string',
122            ),
123            'skip_cache' => array(
124                'required' => false,
125                'type'     => 'boolean',
126            ),
127        );
128    }
129
130    /**
131     * Gets the arguments for the homepages endpoint.
132     *
133     * @return array The array of arguments.
134     */
135    public function get_homepages_args() {
136        return array(
137            'site_description' => array(
138                'required'          => true,
139                'type'              => 'string',
140                'sanitize_callback' => 'sanitize_text_field',
141            ),
142            'locale'           => array(
143                'required' => true,
144                'type'     => 'string',
145            ),
146        );
147    }
148
149    /**
150     * Gets the arguments for the '/pages/sitemap' endpoint.
151     *
152     * @return array The array of arguments.
153     */
154    public function get_publish_sitemap_pages_args() {
155        return array(
156            'site_description' => array(
157                'required'          => true,
158                'type'              => 'string',
159                'sanitize_callback' => 'sanitize_text_field',
160            ),
161        );
162    }
163
164    /**
165     * Gets the arguments for the 'get-homepages' endpoint.
166     *
167     * @return array The array of arguments.
168     */
169    public function get_regenerate_homepage_args() {
170        return array(
171            'site_description' => array(
172                'required'          => true,
173                'type'              => 'string',
174                'sanitize_callback' => 'sanitize_text_field',
175            ),
176            'slug'             => array(
177                'required' => false,
178            ),
179            'colorPalettes'    => array(
180                'required' => false,
181            ),
182            'isFavorite'       => array(
183                'required' => true,
184            ),
185        );
186    }
187
188    /**
189     * Gets all the valid Identifiers
190     *
191     * @return array
192     */
193    public function get_enabled_identifiers() {
194        return array_keys( array_filter( SiteGenService::enabled_identifiers() ) );
195    }
196
197    /**
198     * Generate Sitegen meta data.
199     *
200     * @param \WP_REST_Request $request Request model.
201     *
202     * @return array|WP_Error
203     */
204    public function generate_sitegen_meta( \WP_REST_Request $request ) {
205        if ( ! SiteGenService::is_enabled() ) {
206            return new \WP_Error(
207                'nfd_onboarding_error',
208                'SiteGen is Disabled.',
209                array( 'status' => 404 )
210            );
211        }
212
213        $site_info  = $request->get_param( 'site_info' );
214        $identifier = $request->get_param( 'identifier' );
215        $locale     = $request->get_param( 'locale' );
216        $skip_cache = $request->get_param( 'skip_cache' );
217
218        return SiteGenService::instantiate_site_meta(
219            $site_info,
220            $identifier,
221            $locale,
222            $skip_cache
223        );
224    }
225
226    /**
227     * Gets the preview homepages
228     *
229     * @param \WP_REST_Request $request parameter.
230     * @return array
231     */
232    public function get_homepages( \WP_REST_Request $request ) {
233        $existing_homepages = SiteGenService::get_homepages();
234        if ( ! empty( $existing_homepages ) ) {
235            return new \WP_REST_Response( $existing_homepages, 200 );
236        }
237
238        $site_description = $request->get_param( 'site_description' );
239        $locale           = $request->get_param( 'locale' );
240        $site_info        = array( 'site_description' => $site_description );
241
242        $target_audience = SiteGenService::instantiate_site_meta( $site_info, 'target_audience', $locale );
243        if ( is_wp_error( $target_audience ) ) {
244            return $target_audience;
245        }
246
247        $content_style = SiteGenService::instantiate_site_meta( $site_info, 'content_tones', $locale );
248        if ( is_wp_error( $content_style ) ) {
249            return $content_style;
250        }
251
252        $homepages = SiteGenService::generate_homepages(
253            $site_description,
254            $content_style,
255            $target_audience,
256            $locale,
257        );
258
259        if ( is_wp_error( $homepages ) ) {
260            return $homepages;
261        }
262
263        return new \WP_REST_Response( $homepages, 201 );
264    }
265
266    /**
267     * Gets the regenerated preview homepages
268     *
269     * @param \WP_REST_Request $request parameter.
270     * @return array
271     */
272    public function regenerate_homepage( \WP_REST_Request $request ) {
273        $site_description = $request->get_param( 'site_description' );
274        $slug             = $request->get_param( 'slug' );
275        $color_palette    = $request->get_param( 'palette' );
276        $is_favorite      = $request->get_param( 'isFavorite' );
277        $site_info        = array( 'site_description' => $site_description );
278        $locale           = $request->get_param( 'locale' );
279        $skip_cache       = $request->get_param( 'skip_cache' );
280
281        $target_audience = SiteGenService::instantiate_site_meta( $site_info, 'target_audience', $locale, $skip_cache );
282        if ( is_wp_error( $target_audience ) ) {
283            return $target_audience;
284        }
285        $content_style = SiteGenService::instantiate_site_meta( $site_info, 'content_tones', $locale, $skip_cache );
286        if ( is_wp_error( $content_style ) ) {
287            return $content_style;
288        }
289
290        if ( $is_favorite ) {
291            $result = SiteGenService::regenerate_favorite_homepage( $slug, $color_palette );
292        } else {
293            $result = SiteGenService::regenerate_homepage( $site_description, $content_style, $target_audience, $locale );
294        }
295
296        if ( null === $result ) {
297            return new \WP_Error(
298                'nfd_onboarding_error',
299                __( 'Error at Regenerating home pages.', 'wp-module-onboarding' ),
300                array(
301                    'status' => 400,
302                )
303            );
304        }
305
306        return new \WP_REST_Response( $result, 200 );
307    }
308
309    /**
310     * Publish the pages in the sitemap.
311     *
312     * @param \WP_REST_Request $request The incoming request
313     * @return \WP_REST_Response|\WP_Error
314     */
315    public function publish_sitemap_pages( \WP_REST_Request $request ) {
316        $site_description = $request->get_param( 'site_description' );
317        $site_info        = array( 'site_description' => $site_description );
318        $locale           = $request->get_param( 'locale' );
319        $skip_cache       = $request->get_param( 'skip_cache' );
320
321        $target_audience = SiteGenService::instantiate_site_meta( $site_info, 'target_audience', $locale, $skip_cache );
322        if ( is_wp_error( $target_audience ) ) {
323            return $target_audience;
324        }
325
326        $content_style = SiteGenService::instantiate_site_meta( $site_info, 'content_tones', $locale, $skip_cache );
327        if ( is_wp_error( $content_style ) ) {
328            return $content_style;
329        }
330
331        $sitemap = SiteGenService::instantiate_site_meta( $site_info, 'sitemap', $locale, $skip_cache );
332        if ( is_wp_error( $sitemap ) ) {
333            return $sitemap;
334        }
335
336        SiteGenService::publish_sitemap_pages( $site_description, $content_style, $target_audience, $sitemap, $locale );
337
338        return new \WP_REST_Response( array(), 201 );
339    }
340
341    /**
342     * Generate Sitegen Site Details meta data.
343     *
344     * @return array|WP_Error
345     */
346    public function get_site_details_meta() {
347        return SiteGenData::get_site_details_questionnaire();
348    }
349
350    /**
351     * Get Sitegen Customize sidebar data.
352     *
353     * @return array|WP_Error
354     */
355    public function get_customize_sidebar_data() {
356        return SiteGenService::get_customize_sidebar_data();
357    }
358}