Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 100
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
PluginsController
0.00% covered (danger)
0.00%
0 / 100
0.00% covered (danger)
0.00%
0 / 6
870
0.00% covered (danger)
0.00%
0 / 1
 activate
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 check_plugin_status
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 install_plugin
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
30
 activate_plugin
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 setup_plugin
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 process_plugin
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 1
210
1<?php
2namespace NewfoldLabs\WP\Module\Patterns\Api\Controllers;
3
4use NewfoldLabs\WP\Module\Patterns\Services\PluginService;
5use WP_REST_Response;
6use WP_Error;
7
8/**
9 * Controller for plugins.
10 */
11class PluginsController {
12
13    /**
14     * Activate multiple plugins (legacy endpoint).
15     *
16     * @param \WP_REST_Request $request Request object.
17     * @return WP_REST_Response Response object.
18     */
19    public static function activate( $request ) {
20        $plugins = $request->get_param( 'plugins' );
21
22        PluginService::activate( $plugins );
23        PluginService::setup( $plugins );
24
25        return new \WP_REST_Response( array() );
26    }
27
28    /**
29     * Check status of a single plugin.
30     *
31     * @param \WP_REST_Request $request Request object.
32     * @return WP_REST_Response|WP_Error Response object or error.
33     */
34    public static function check_plugin_status( $request ) {
35        $plugin = $request->get_param( 'plugin' );
36
37        if ( empty( $plugin ) ) {
38            return new WP_Error(
39                'missing_plugin_param',
40                __( 'The plugin parameter is required.', 'nfd-wonder-blocks' ),
41                array( 'status' => 400 )
42            );
43        }
44
45        return new WP_REST_Response(
46            array(
47                'slug'   => is_array( $plugin ) ? $plugin['slug'] : $plugin,
48                'status' => $plugin['status'] ?? 'not-installed',
49            )
50        );
51    }
52
53    /**
54     * Install a single plugin.
55     *
56     * @param \WP_REST_Request $request Request object.
57     * @return WP_REST_Response|WP_Error Response object or error.
58     */
59    public static function install_plugin( $request ) {
60        $plugin = $request->get_param( 'plugin' );
61
62        if ( empty( $plugin ) ) {
63            return new WP_Error(
64                'missing_plugin_param',
65                __( 'The plugin parameter is required.', 'nfd-wonder-blocks' ),
66                array( 'status' => 400 )
67            );
68        }
69
70        $activate = $request->get_param( 'activate' ) !== false;
71        $result   = PluginService::install( $plugin, $activate );
72
73        if ( is_wp_error( $result ) ) {
74            return $result;
75        }
76
77        return new WP_REST_Response(
78            array(
79                'success'   => $result,
80                'slug'      => is_array( $plugin ) ? $plugin['slug'] : $plugin,
81                'activated' => $activate && $result,
82            )
83        );
84    }
85
86    /**
87     * Activate a single plugin.
88     *
89     * @param \WP_REST_Request $request Request object.
90     * @return WP_REST_Response|WP_Error Response object or error.
91     */
92    public static function activate_plugin( $request ) {
93        $plugin = $request->get_param( 'plugin' );
94
95        if ( empty( $plugin ) ) {
96            return new WP_Error(
97                'missing_plugin_param',
98                __( 'The plugin parameter is required.', 'nfd-wonder-blocks' ),
99                array( 'status' => 400 )
100            );
101        }
102
103        $success = PluginService::activate_plugin( $plugin );
104
105        return new WP_REST_Response(
106            array(
107                'success' => $success,
108                'slug'    => is_array( $plugin ) ? $plugin['slug'] : $plugin,
109            )
110        );
111    }
112
113    /**
114     * Setup a single plugin integration.
115     *
116     * @param \WP_REST_Request $request Request object.
117     * @return WP_REST_Response|WP_Error Response object or error.
118     */
119    public static function setup_plugin( $request ) {
120        $plugin = $request->get_param( 'plugin' );
121
122        if ( empty( $plugin ) ) {
123            return new WP_Error(
124                'missing_plugin_param',
125                __( 'The plugin parameter is required.', 'nfd-wonder-blocks' ),
126                array( 'status' => 400 )
127            );
128        }
129
130        $success = PluginService::setup_plugin( $plugin );
131
132        return new WP_REST_Response(
133            array(
134                'success' => $success,
135                'slug'    => is_array( $plugin ) ? $plugin['slug'] : $plugin,
136            )
137        );
138    }
139
140    /**
141     * Process a single plugin completely - check, install, activate, and setup.
142     *
143     * @param \WP_REST_Request $request Request object.
144     * @return WP_REST_Response|WP_Error Response object or error.
145     */
146    public static function process_plugin( $request ) {
147        $plugin = $request->get_param( 'plugin' );
148
149        if ( empty( $plugin ) ) {
150            return new WP_Error(
151                'missing_plugin_param',
152                __( 'The plugin parameter is required.', 'nfd-wonder-blocks' ),
153                array( 'status' => 400 )
154            );
155        }
156
157        $slug   = is_array( $plugin ) ? $plugin['slug'] : $plugin;
158        $result = array(
159            'slug'  => $slug,
160            'steps' => array(),
161        );
162
163        // Step 1: Check status
164        $is_installed = PluginService::is_installed( $plugin );
165        $is_active    = $is_installed && PluginService::is_active( $plugin );
166
167        $result['initial_status'] = $is_active ? 'active' : ( $is_installed ? 'inactive' : 'not-installed' );
168
169        // Step 2: Install if needed
170        if ( ! $is_installed ) {
171            $install_success            = PluginService::install( $plugin, true );
172            $result['steps']['install'] = $install_success;
173
174            if ( $install_success ) {
175                $is_active = true; // install() activates by default
176            } else {
177                // If installation failed, return early
178                $result['final_status'] = 'not-installed';
179                $result['success']      = false;
180                return new WP_REST_Response( $result );
181            }
182        }
183
184        // Step 3: Activate if needed
185        if ( $is_installed && ! $is_active ) {
186            $activate_success            = PluginService::activate_plugin( $plugin );
187            $result['steps']['activate'] = $activate_success;
188
189            if ( $activate_success ) {
190                $is_active = true;
191            } else {
192                $result['final_status'] = 'inactive';
193                $result['success']      = false;
194                return new WP_REST_Response( $result );
195            }
196        }
197
198        // Step 4: Setup if active
199        if ( $is_active ) {
200            $setup_success            = PluginService::setup_plugin( $plugin );
201            $result['steps']['setup'] = $setup_success;
202        }
203
204        $result['final_status'] = $is_active ? 'active' : ( $is_installed ? 'inactive' : 'not-installed' );
205        $result['success']      = $is_active;
206
207        return new WP_REST_Response( $result );
208    }
209}