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