Test Failed
Branch main (7214dc)
by Rafael
06:52
created

ConfigController::doGoMigrations()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
/* Copyright (C) 2024       Rafael San José         <[email protected]>
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 3 of the License, or
8
 * any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
 */
18
19
namespace CoreModules\Admin\Controller;
20
21
use Alxarafe\Base\Config;
22
use Alxarafe\Base\Controller\ViewController;
23
use Alxarafe\Base\Database;
24
use Alxarafe\Lib\Functions;
25
use Alxarafe\Lib\Messages;
26
use Alxarafe\Lib\Trans;
27
use Alxarafe\Tools\ModuleManager;
28
use DebugBar\DebugBarException;
29
use stdClass;
30
31
/**
32
 * Class ConfigController. App settings controller.
33
 */
34
class ConfigController extends ViewController
35
{
36
    const MENU = 'admin|config';
37
    const SIDEBAR_MENU = [
38
        ['option' => 'admin|auth|logout', 'url' => 'index.php?module=Admin&controller=Auth&method=logout'],
39
        ['option' => 'general', 'url' => 'index.php?module=Admin&controller=Config&method=general'],
40
        ['option' => 'appearance', 'url' => 'index.php?module=Admin&controller=Config&method=appearance'],
41
        ['option' => 'security', 'url' => 'index.php?module=Admin&controller=Config&method=security']
42
    ];
43
44
    /**
45
     * Configuration file information
46
     *
47
     * @var stdClass
48
     */
49
    public $data;
50
51
    /**
52
     * Array with availables languages
53
     *
54
     * @var array
55
     */
56
    public $languages;
57
    public $themes;
58
    public $dbtypes;
59
60
    public $db_create;
61
    public bool $pdo_connection;
62
    public bool $pdo_db_exists;
63
64
    /**
65
     * Returns the module name for use in url function
66
     *
67
     * @return string
68
     */
69
    public static function getModuleName(): string
70
    {
71
        return 'Admin';
72
    }
73
74
    /**
75
     * Returns the controller name for use in url function
76
     *
77
     * @return string
78
     */
79
    public static function getControllerName(): string
80
    {
81
        return 'Config';
82
    }
83
84
    public function beforeAction(): bool
85
    {
86
        $this->getPost();
87
88
        $this->languages = Trans::getAvailableLanguages();
89
        $this->themes = Functions::getThemes();
90
        $this->dbtypes = Database::getDbDrivers();
91
92
        Trans::setLang($this->config->main->language ?? Trans::FALLBACK_LANG);
93
94
        $this->checkDatabaseStatus();
95
96
        return parent::beforeAction();
97
    }
98
99
    /**
100
     * Sets $data with the information sent by POST
101
     *
102
     * @return void
103
     */
104
    private function getPost(): void
105
    {
106
        $this->data = Config::getConfig();
107
        if (!isset($this->data)) {
108
            $this->data = new stdClass();
109
        }
110
111
        foreach (Config::CONFIG_STRUCTURE as $section => $values) {
112
            if (!isset($this->data->{$section})) {
113
                $this->data->{$section} = new stdClass();
114
            }
115
            foreach ($values as $variable) {
116
                $value = Functions::getIfIsset($variable, $this->data->{$section}->{$variable} ?? '');
117
                if (!isset($value)) {
118
                    continue;
119
                }
120
                $this->data->{$section}->{$variable} = $value;
121
            }
122
        }
123
124
        $this->db_create = filter_input(INPUT_POST, 'db_create');
125
    }
126
127
    private function checkDatabaseStatus()
128
    {
129
        $this->pdo_connection = Database::checkConnection($this->data->db);
130
        $this->pdo_db_exists = Database::checkIfDatabaseExists($this->data->db);
131
        if (!$this->pdo_connection) {
132
            Messages::addAdvice(Trans::_('pdo_connection_error'));
133
        } elseif (!$this->pdo_db_exists) {
134
            Messages::addAdvice(Trans::_('pdo_db_connection_error', ['db' => $this->data->db->name]));
135
        }
136
    }
137
138
    /**
139
     * The 'index' action: Default action
140
     *
141
     * @return bool
142
     */
143
    public function doIndex(): bool
144
    {
145
        /**
146
         * TODO: The value of this variable will be filled in when the roles
147
         *       are correctly implemented.
148
         */
149
        $restricted_access = false;
150
151
        if (isset($this->config) && $restricted_access) {
0 ignored issues
show
introduced by
The condition $restricted_access is always false.
Loading history...
152
            $this->template = 'page/forbidden';
153
        }
154
155
        return true;
156
    }
157
158
    /**
159
     * The 'createDatabase' action: Creates the database
160
     *
161
     * @return bool
162
     */
163
    public function doCreateDatabase(): bool
164
    {
165
        if (!Database::createDatabaseIfNotExists($this->data->db)) {
166
            Messages::addError(Trans::_('error_connecting_database', ['db' => $this->data->db->name]));
167
            return true;
168
        }
169
        Messages::addMessage(Trans::_('successful_connection_database', ['db' => $this->data->db->name]));
170
        return false;
171
    }
172
173
    public function doGoMigrations(): void
174
    {
175
        Functions::httpRedirect(MigrationController::url());
176
    }
177
178
    /**
179
     * CheckConnection action.
180
     *
181
     * @return bool
182
     * @throws DebugBarException
183
     */
184
    public function doCheckConnection(): bool
185
    {
186
        $ok = Database::checkDatabaseConnection($this->data->db, $this->db_create);
187
        if (!$ok) {
188
//            $messages = Messages::getMessages();
189
//            foreach ($messages as $message) {
190
//                Messages::addAdvice($message);
191
//            }
192
            Messages::addError(Trans::_('error_connecting_database', ['db' => $this->data->db->name]));
193
            return true;
194
        }
195
        Messages::addMessage(Trans::_('successful_connection_database', ['db' => $this->data->db->name]));
196
197
        return static::doRunMigrationsAndSeeders();
0 ignored issues
show
Bug Best Practice introduced by
The method CoreModules\Admin\Contro...nMigrationsAndSeeders() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

197
        return static::/** @scrutinizer ignore-call */ doRunMigrationsAndSeeders();
Loading history...
198
    }
199
200
    public function doRunMigrationsAndSeeders(): bool
201
    {
202
        new Database($this->data->db);
203
204
        Config::runMigrations();
205
        Config::runSeeders();
206
207
        return true;
208
    }
209
210
    /**
211
     * Save action.
212
     *
213
     * @return bool
214
     * @throws DebugBarException
215
     */
216
    public function doSave(): bool
217
    {
218
        if (!config::setConfig($this->data)) {
219
            Messages::addError(Trans::_('error_saving_settings'));
220
            return false;
221
        }
222
223
        Messages::addMessage(Trans::_('settings_saved_successfully'));
224
        return true;
225
    }
226
227
    public function doExit()
228
    {
229
        /**
230
         * TODO: Loads public page
231
         */
232
        $this->template = 'page/public';
233
        return true;
234
    }
235
236
    public function doRegenerate()
237
    {
238
        ModuleManager::regenerate();
239
        return true;
240
    }
241
}
242