Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 109
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
FlowController
0.00% covered (danger)
0.00%
0 / 109
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 1
 register_routes
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 1
2
 get_switch_args
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 get
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 save_onboarding_flow_data
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 complete
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
56
 switch
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2namespace NewfoldLabs\WP\Module\Onboarding\RestApi;
3
4use NewfoldLabs\WP\Module\Onboarding\Data\Options;
5use NewfoldLabs\WP\Module\Onboarding\Permissions;
6use NewfoldLabs\WP\Module\Onboarding\Data\Services\FlowService;
7use NewfoldLabs\WP\Module\Onboarding\Services\PluginService;
8use NewfoldLabs\WP\Module\Onboarding\Data\Services\SiteGenService;
9use NewfoldLabs\WP\Module\Onboarding\Data\Services\GlobalStylesService;
10use NewfoldLabs\WP\Module\Onboarding\Services\StatusService;
11use NewfoldLabs\WP\Module\Onboarding\Data\Services\TemplatePartsService;
12
13/**
14 * Class FlowController
15 */
16class FlowController {
17
18    /**
19     * This is the REST API namespace that will be used for our custom API
20     *
21     * @var string
22     */
23    protected $namespace = 'newfold-onboarding/v1';
24
25    /**
26     * This is the REST endpoint
27     *
28     * @var string
29     */
30    protected $rest_base = '/flow';
31
32    /**
33     * Registers rest routes for this controller class.
34     *
35     * @return void
36     */
37    public function register_routes() {
38        \register_rest_route(
39            $this->namespace,
40            $this->rest_base,
41            array(
42                array(
43                    'methods'             => \WP_REST_Server::READABLE,
44                    'callback'            => array( $this, 'get' ),
45                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
46                ),
47                array(
48                    'methods'             => \WP_REST_Server::EDITABLE,
49                    'callback'            => array( $this, 'save_onboarding_flow_data' ),
50                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
51                ),
52            )
53        );
54        \register_rest_route(
55            $this->namespace,
56            $this->rest_base . '/complete',
57            array(
58                array(
59                    'methods'             => \WP_REST_Server::CREATABLE,
60                    'callback'            => array( $this, 'complete' ),
61                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
62                ),
63            )
64        );
65
66        \register_rest_route(
67            $this->namespace,
68            $this->rest_base . '/switch',
69            array(
70                array(
71                    'methods'             => \WP_REST_Server::CREATABLE,
72                    'callback'            => array( $this, 'switch' ),
73                    'permission_callback' => array( Permissions::class, 'rest_is_authorized_admin' ),
74                    'args'                => $this->get_switch_args(),
75                ),
76            )
77        );
78    }
79
80    /**
81     * Get the valid request params for the switch endpoint.
82     *
83     * @return array
84     */
85    public function get_switch_args() {
86        return array(
87            'flow' => array(
88                'required'          => true,
89                'type'              => 'string',
90                'sanitize_callback' => 'sanitize_text_field',
91            ),
92        );
93    }
94
95    /**
96     * Get Onboarding flow data.
97     *
98     * @return \WP_REST_Response
99     */
100    public function get() {
101        return new \WP_REST_Response(
102            FlowService::get_data(),
103            200
104        );
105    }
106
107    /**
108     * Update the Onboarding flow data.
109     *
110     * @param \WP_REST_Request $request The incoming request.
111     *
112     * @return \WP_Error|\WP_REST_Response
113     */
114    public function save_onboarding_flow_data( \WP_REST_Request $request ) {
115        $params = json_decode( $request->get_body(), true );
116
117        // Mark Onboarding as started only on the first REST API request from the React App.
118        update_option( Options::get_option_name( 'redirect' ), '0' );
119        StatusService::handle_started();
120
121        $flow_data = FlowService::update_data( $params );
122        if ( is_wp_error( $flow_data ) ) {
123            return $flow_data;
124        }
125
126        return new \WP_REST_Response(
127            $flow_data,
128            200
129        );
130    }
131
132    /**
133     * Handles the completion of different onboarding flows.
134     *
135     * This function processes the completion of various onboarding flows,
136     * such as site generation and site page publishing, and updates global
137     * styles and template parts if necessary.
138     *
139     * @param \WP_REST_Request $request The request object containing the flow parameter.
140     *
141     * @return \WP_REST_Response|\WP_Error A WP_REST_Response object on success, or a WP_Error object on failure.
142     */
143    public function complete( $request ) {
144        // Retrieve the 'flow' parameter from the request
145        $flow = $request->get_param( 'flow' );
146
147        if ( 'sitegen' === $flow ) {
148            // Read flow data from the WordPress options table
149            $flow_data_option = FlowService::read_data_from_wp_option( false );
150            // Check if flow data does not exist or 'data' key is not set
151            if ( false === $flow_data_option || ! isset( $flow_data_option['data'] ) ) {
152                return new \WP_Error(
153                    'nfd_onboarding_error',
154                    __( 'Flow data does not exist to generate a child theme.', 'wp-module-onboarding' ),
155                    array( 'status' => 500 )
156                );
157            }
158            // Retrieve homepage data and the active homepage from the flow data
159            $homepage_data   = $flow_data_option['sitegen']['homepages']['data'];
160            $active_homepage = $flow_data_option['sitegen']['homepages']['active'];
161            // Complete the Sitegen flow using the retrieved data
162            SiteGenService::complete( $active_homepage, $homepage_data );
163            return new \WP_REST_Response(
164                array(),
165                201
166            );
167        }
168        // If the flow is not 'sitegen', proceed with publishing site pages
169        $site_pages_publish_request = new \WP_REST_Request(
170            'POST',
171            '/newfold-onboarding/v1/site-pages/publish'
172        );
173        // Execute the request to publish site pages
174        $site_pages_publish_response = rest_do_request( $site_pages_publish_request );
175        if ( $site_pages_publish_response->is_error() ) {
176            return $site_pages_publish_response->as_error();
177        }
178
179        // Get the post ID of the active custom global styles and update it
180        $active_custom_global_styles_post_id = GlobalStylesService::get_active_custom_global_styles_post_id();
181        $status                              = GlobalStylesService::update_diy_global_style_variation( $active_custom_global_styles_post_id, );
182        if ( is_wp_error( $status ) ) {
183            return $status;
184        }
185
186        // Update the selected template parts
187        $status = TemplatePartsService::update_diy_selected_template_parts();
188        if ( is_wp_error( $status ) ) {
189            return $status;
190        }
191
192        // Return a successful response after completing all processes
193        return new \WP_REST_Response(
194            array(
195                'message' => __( 'Success.', 'wp-module-onboarding' ),
196            ),
197            201
198        );
199    }
200
201    /**
202     * Switch the Onboarding flow.
203     *
204     * @param \WP_REST_Request $request The incoming switch request.
205     * @return \WP_Error|\WP_REST_Response
206     */
207    public function switch( \WP_REST_Request $request ) {
208        $flow   = $request->get_param( 'flow' );
209        $status = FlowService::switch_flow( $flow );
210        if ( \is_wp_error( $status ) ) {
211            return $status;
212        }
213
214        if ( ! PluginService::initialize() ) {
215            return new \WP_REST_Response(
216                array(),
217                500
218            );
219        }
220
221        return new \WP_REST_Response(
222            array(),
223            200
224        );
225    }
226}