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