Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
93.24% covered (success)
93.24%
138 / 148
62.50% covered (warning)
62.50%
5 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApplicationController
93.24% covered (success)
93.24%
138 / 148
62.50% covered (warning)
62.50%
5 / 8
42.54
0.00% covered (danger)
0.00%
0 / 1
 init
91.49% covered (success)
91.49%
43 / 47
0.00% covered (danger)
0.00%
0 / 1
12.09
 env
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
6
 status
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 down
90.38% covered (success)
90.38%
47 / 52
0.00% covered (danger)
0.00%
0 / 1
14.17
 up
94.44% covered (success)
94.44%
17 / 18
0.00% covered (danger)
0.00%
0 / 1
4.00
 createController
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 createModel
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 createView
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Pop PHP Framework (http://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/pop-bootstrap
6 * @author     Nick Sagona, III <nick@nolainteractive.com>
7 * @copyright  Copyright (c) 2012-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
8 * @license    http://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Kettle\Controller;
15
16use Pop\Console\Color;
17use Pop\Kettle\Event;
18use Pop\Kettle\Model;
19use Pop\App;
20
21/**
22 * Console application controller class
23 *
24 * @category   Pop\Kettle
25 * @package    Pop\Kettle
26 * @author     Nick Sagona, III <nick@nolainteractive.com>
27 * @copyright  Copyright (c) 2012-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
28 * @license    http://www.popphp.org/license     New BSD License
29 * @version    2.3.2
30 */
31class ApplicationController extends AbstractController
32{
33
34    /**
35     * Init command
36     *
37     * @param  string $namespace
38     * @param  array  $options
39     * @return void
40     */
41    public function init(string $namespace, array $options = []): void
42    {
43        $web  = (isset($options['web']));
44        $api  = (isset($options['api']));
45        $cli  = (isset($options['cli']));
46        $envs = [
47            'local'      => 1,
48            'dev'        => 2,
49            'testing'    => 3,
50            'staging'    => 4,
51            'production' => 5,
52        ];
53
54        $name = $this->console->prompt('What is the name of your app? [Pop] ', null, true);
55        if ($name == '') {
56            $name = 'Pop';
57        } else if (str_contains($name, ' ') && !str_starts_with($name, '"') && !str_ends_with($name, '"')) {
58            $name = '"' . $name . '"';
59        }
60
61        $this->console->write();
62        foreach ($envs as $env => $i) {
63            $this->console->write($i . ': ' . $env);
64        }
65        $this->console->write();
66
67        // For testing purposes
68        if (isset($_SERVER['X_POP_CONSOLE_INPUT_2'])) {
69            $_SERVER['X_POP_CONSOLE_INPUT'] = $_SERVER['X_POP_CONSOLE_INPUT_2'];
70        }
71
72        $e   = $this->console->prompt('Please select an app environment from above: ', $envs);
73        $env = array_search($e, $envs);
74
75        // For testing purposes
76        if (isset($_SERVER['X_POP_CONSOLE_INPUT_3'])) {
77            $_SERVER['X_POP_CONSOLE_INPUT'] = $_SERVER['X_POP_CONSOLE_INPUT_3'];
78        }
79
80        $url = $this->console->prompt('What is the URL of your app? [http://localhost] ', null, true);
81        if ($url == '') {
82            $url = 'http://localhost';
83        }
84
85        $appModel = new Model\Application();
86        $dbModel  = new Model\Database();
87        $location = getcwd();
88
89        if (empty($namespace)) {
90            $namespace = 'MyApp';
91        }
92
93        $appModel->init($location, $namespace, $web, $api, $cli, $name, $env, $url);
94
95        $this->console->write();
96        $this->console->write("Installing files for '" . $namespace ."'...");
97        $this->console->write();
98
99        // For testing purposes
100        if (isset($_SERVER['X_POP_CONSOLE_INPUT_4'])) {
101            $_SERVER['X_POP_CONSOLE_INPUT'] = $_SERVER['X_POP_CONSOLE_INPUT_4'];
102        }
103
104        $createDb = $this->console->prompt(
105            'Would you like to configure a database? [Y/N] ', ['y', 'n']
106        );
107
108        if (strtolower($createDb) == 'y') {
109            $this->console->write();
110            $dbModel->configure($this->console, $location);
111        }
112
113        $this->console->write();
114        $this->console->write('Done!');
115    }
116
117    /**
118     * Env command
119     *
120     * @return void
121     */
122    public function env(): void
123    {
124        if (App::isProduction()) {
125            $this->console->alertWarning('Application in Production', 40);
126        } else if (App::isStaging()) {
127            $this->console->alertPrimary('Application in Staging', 40);
128        } else if (App::isTesting()) {
129            $this->console->alertSecondary('Application in Testing', 40);
130        } else if (App::isDev()) {
131            $this->console->alertDark('Application in Dev', 40);
132        } else if (App::isLocal()) {
133            $this->console->alertLight('Application in Local', 40);
134        }
135    }
136
137    /**
138     * Status command
139     *
140     * @return void
141     */
142    public function status(): void
143    {
144        if (App::isUp()) {
145            $this->console->alertSuccess('Application is Live', 40);
146        }
147    }
148
149    /**
150     * Down command
151     *
152     * @param  array $options
153     * @return void
154     */
155    public function down(array $options = []): void
156    {
157        $location = getcwd();
158        $secret   = null;
159
160        if (array_key_exists('secret', $options)) {
161            $secret = (($options['secret'] === null) || ($options['secret'] == '')) ? sha1(time()) : $options['secret'];
162        }
163
164        if (file_exists($location . '/.env') && (App::isUp())) {
165            $e = file_get_contents($location . '/.env');
166            $e = str_replace(
167                [
168                    'MAINTENANCE_MODE=false',
169                    'MAINTENANCE_MODE="false"',
170                    'MAINTENANCE_MODE=(false)',
171                ],
172                'MAINTENANCE_MODE=true',
173                $e
174            );
175
176            $currentSecret = App::env('MAINTENANCE_MODE_SECRET');
177            if (!empty($secret)) {
178                $e = str_replace(
179                    [
180                        'MAINTENANCE_MODE_SECRET=' . $currentSecret,
181                        'MAINTENANCE_MODE_SECRET="' . $currentSecret . '"',
182                    ],
183                    'MAINTENANCE_MODE_SECRET=' . $secret,
184                    $e
185                );
186            } else if (!empty($currentSecret)) {
187                $secret = $currentSecret;
188            }
189
190            file_put_contents($location . '/.env', $e);
191
192            $this->console->alertInfo('Application in Maintenance', 40);
193            $this->console->write('Application has been switched to maintenance mode.');
194            if (!empty($secret)) {
195                $this->console->write('');
196                $this->console->write('The secret is ' . $this->console->colorize($secret, Color::BOLD_GREEN));
197            }
198        } else if (file_exists($location . '/.env') && (App::isDown())) {
199            $this->console->write('Application is currently in maintenance mode. No action to take.');
200            $currentSecret = App::env('MAINTENANCE_MODE_SECRET');
201            if (!empty($secret)) {
202                $e = str_replace(
203                    [
204                        'MAINTENANCE_MODE_SECRET=' . $currentSecret,
205                        'MAINTENANCE_MODE_SECRET="' . $currentSecret . '"',
206                    ],
207                    'MAINTENANCE_MODE_SECRET=' . $secret,
208                    file_get_contents($location . '/.env')
209                );
210
211                file_put_contents($location . '/.env', $e);
212            } else if (!empty($currentSecret)) {
213                $secret = $currentSecret;
214            }
215            if (!empty($secret)) {
216                $this->console->write('');
217                $this->console->write('The secret is ' . $this->console->colorize($secret, Color::BOLD_GREEN));
218            }
219        } else {
220            $this->console->write('No .env file found.');
221        }
222    }
223
224    /**
225     * Up command
226     *
227     * @return void
228     */
229    public function up(): void
230    {
231        $location = getcwd();
232
233        if (file_exists($location . '/.env') && (App::isDown())) {
234            $e = str_replace(
235                [
236                    'MAINTENANCE_MODE=true',
237                    'MAINTENANCE_MODE="true"',
238                    'MAINTENANCE_MODE=(true)',
239                ],
240                'MAINTENANCE_MODE=false',
241                file_get_contents($location . '/.env')
242            );
243
244            file_put_contents($location . '/.env', $e);
245
246            $this->console->alertSuccess('Application is Live', 40);
247            $this->console->write('Application has been made live.');
248        } else if (App::isUp()) {
249            $this->console->alertSuccess('Application is Live', 40);
250            $this->console->write('Application is currently live. No action to take.');
251        } else {
252            $this->console->write('No .env file found.');
253        }
254    }
255
256    /**
257     * Create controller command
258     *
259     * @param  string $ctrl
260     * @param  array  $options
261     * @return void
262     */
263    public function createController(string $ctrl, array $options = []): void
264    {
265        $web = (isset($options['web']));
266        $api = (isset($options['api']));
267        $cli = (isset($options['cli']));
268
269        $appModel    = new Model\Application();
270        $ctrlClasses = $appModel->createController($ctrl, getcwd(), $web, $api, $cli);
271
272        foreach ($ctrlClasses as $ctrlClass) {
273            $this->console->write("Controller class '" . $ctrlClass ."' created.");
274        }
275
276        $this->console->write();
277        $this->console->write('Done!');
278    }
279
280    /**
281     * Create model command
282     *
283     * @param  string $model
284     * @param  array  $options
285     * @return void
286     */
287    public function createModel(string $model, array $options = []): void
288    {
289        $appModel   = new Model\Application();
290        $modelClass = $appModel->createModel($model, getcwd(), (isset($options['data'])));
291
292        $this->console->write("Model class '" . $modelClass ."' created.");
293        $this->console->write();
294        $this->console->write('Done!');
295    }
296
297    /**
298     * Create view command
299     *
300     * @param  string $view
301     * @return void
302     */
303    public function createView(string $view): void
304    {
305        $appModel = new Model\Application();
306        $viewFile = $appModel->createView($view, getcwd());
307
308        $this->console->write("View file '" . $viewFile ."' created.");
309        $this->console->write();
310        $this->console->write('Done!');
311    }
312
313}