Test Failed
Push — master ( 62e8aa...e74fb5 )
by Julien
04:23
created

Config::__construct()   B

Complexity

Conditions 4
Paths 2

Size

Total Lines 1236
Code Lines 787

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1006
CRAP Score 4

Importance

Changes 19
Bugs 3 Features 8
Metric Value
cc 4
eloc 787
c 19
b 3
f 8
nc 2
nop 2
dl 0
loc 1236
ccs 1006
cts 1007
cp 0.999
crap 4
rs 8

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * This file is part of the Zemit Framework.
5
 *
6
 * (c) Zemit Team <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE.txt
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Zemit\Bootstrap;
13
14
use PDO;
15
use Phalcon\Security;
16
use Zemit\Filter;
17
use Zemit\Filters;
18
use Zemit\Locale;
19
use Zemit\Version;
20
use Zemit\Provider;
21
use Zemit\Utils\Env;
22
use Zemit\Models;
23
use Zemit\Modules\Admin;
24
use Zemit\Modules\Frontend;
25
use Zemit\Modules\Cli;
26
use Zemit\Modules\Api;
27
use Zemit\Mvc\Controller\Behavior;
28
use Phalcon\Config as PhalconConfig;
29
30
/**
31
 * Zemit\Bootstrap\Config
32
 *
33
 * Global Zemit Configuration
34
 *
35
 * @property PhalconConfig $core
36
 * @property PhalconConfig $app
37
 * @property PhalconConfig $php
38
 * @property PhalconConfig $debug
39
 * @property PhalconConfig $response
40
 * @property PhalconConfig $identity
41
 * @property PhalconConfig $models
42
 * @property PhalconConfig $providers
43
 * @property PhalconConfig $logger
44
 * @property PhalconConfig $filters
45
 * @property PhalconConfig $modules
46
 * @property PhalconConfig $router
47
 * @property PhalconConfig $gravatar
48
 * @property PhalconConfig $reCaptcha
49
 * @property PhalconConfig $aws
50
 * @property PhalconConfig $locale
51
 * @property PhalconConfig $translate
52
 * @property PhalconConfig $session
53
 * @property PhalconConfig $module
54
 * @property PhalconConfig $security
55
 * @property PhalconConfig $cache
56
 * @property PhalconConfig $metadata
57
 * @property PhalconConfig $annotations
58
 * @property PhalconConfig $mailer
59
 * @property PhalconConfig $cookies
60
 * @property PhalconConfig $oauth2
61
 * @property PhalconConfig $dotenv
62
 * @property PhalconConfig $client
63
 * @property PhalconConfig $permissions
64
 */
65
class Config extends \Zemit\Config\Config
66
{
67 3
    public function defineConst()
68
    {
69 3
        defined('VENDOR_PATH') || define('VENDOR_PATH', Env::get('ROOT_PATH', 'vendor/'));
70 3
        defined('ROOT_PATH') || define('ROOT_PATH', Env::get('ROOT_PATH'));
71 3
        defined('APP_PATH') || define('APP_PATH', Env::get('APP_PATH'));
72 3
        defined('APPLICATION_ENV') || define('APPLICATION_ENV', Env::get('APPLICATION_ENV', 'development'));
73 3
        defined('CORE_PATH') || define('CORE_PATH', Env::get('CORE_PATH', mb_substr(__DIR__, 0, mb_strlen(basename(__DIR__)) * -1)));
74 3
        defined('PRIVATE_PATH') || define('PRIVATE_PATH', Env::get('APP_PRIVATE_PATH', constant('APP_PATH') . '/private/'));
75
    }
76
    
77
    /**
78
     * Config Constructor
79
     * {@inheritDoc}
80
     *
81
     * @param array $data
82
     * @param bool $insensitive
83
     */
84 3
    public function __construct(array $data = [], bool $insensitive = true)
85
    {
86 3
        $this->defineConst();
87 3
        $now = new \DateTimeImmutable();
88 3
        parent::__construct([
89
            
90
            /**
91
             * Core only settings
92
             */
93 3
            'core' => [
94 3
                'name' => 'Zemit Core',
95 3
                'version' => Version::get(),
96 3
                'package' => 'zemit-cms',
97 3
                'modules' => [
98 3
                    'zemit-' . \Zemit\Mvc\Module::NAME_FRONTEND => [
99 3
                        'className' => \Zemit\Modules\Frontend\Module::class,
100 3
                        'path' => CORE_PATH . 'Modules/Frontend/Module.php',
101 3
                    ],
102 3
                    'zemit-' . \Zemit\Mvc\Module::NAME_ADMIN => [
103 3
                        'className' => \Zemit\Modules\Admin\Module::class,
104 3
                        'path' => CORE_PATH . 'Modules/Admin/Module.php',
105 3
                    ],
106 3
                    'zemit-' . \Zemit\Mvc\Module::NAME_API => [
107 3
                        'className' => \Zemit\Modules\Api\Module::class,
108 3
                        'path' => CORE_PATH . 'Modules/Api/Module.php',
109 3
                    ],
110 3
                    'zemit-' . \Zemit\Mvc\Module::NAME_OAUTH2 => [
111 3
                        'className' => \Zemit\Modules\Oauth2\Module::class,
112 3
                        'path' => CORE_PATH . 'Modules/Oauth2/Module.php',
113 3
                    ],
114 3
                    'zemit-' . \Zemit\Cli\Module::NAME_CLI => [
115 3
                        'className' => \Zemit\Modules\Cli\Module::class,
116 3
                        'path' => CORE_PATH . 'Modules/Cli/Module.php',
117 3
                    ],
118 3
                ],
119 3
                'dir' => [
120 3
                    'base' => CORE_PATH,
121 3
                    'locales' => CORE_PATH . 'Locales',
122 3
                    'modules' => CORE_PATH . 'Modules',
123 3
                ],
124 3
            ],
125
            
126
            /**
127
             * Application configuration
128
             */
129 3
            'app' => [
130 3
                'namespace' => Env::get('APP_NAMESPACE', 'Zemit'), // Namespace of your application
131 3
                'version' => Env::get('APP_VERSION', date('Ymd')), // allow to set and force a specific version
132 3
                'maintenance' => Env::get('APP_MAINTENANCE', false), // Set true to force the maintenance page
133 3
                'env' => Env::get('APP_ENV', Env::get('APPLICATION_ENV', null)), // Set the current environment
134 3
                'debug' => Env::get('APP_DEBUG', false), // Set true to display debug
135 3
                'cache' => Env::get('APP_CACHE', false), // Set true to activate the cache
136 3
                'minify' => Env::get('APP_MINIFY', false), // Set true to activate minifying
137 3
                'copyright' => Env::get('APP_COPYRIGHT', false), // Set true to activate the copyright
138 3
                'profiler' => Env::get('APP_PROFILER', false), // Set true to return the profiler
139 3
                'logger' => Env::get('APP_LOGGER', false), // Set true to enable logging
140 3
                'uri' => Env::get('APP_URI', '/'), // Base URI of your application
141 3
                'staticUri' => Env::get('APP_STATIC_URI', '/'), // Base URI of your application
142 3
                'encoding' => Env::get('APP_ENCODING', 'UTF-8'), // allow to set encoding to use with the application
143 3
                'timezone' => Env::get('APP_TIMEZONE', 'America/Montreal'), // allow to set timezone to use with the application
144 3
                'timeoutLimit' => Env::get('APP_TIMEOUT_LIMIT', 60), // allow to set timeout limit to use with the application
145 3
                'memoryLimit' => Env::get('APP_MEMORY_LIMIT', '256M'), // allow to set timeout limit to use with the application
146 3
                'sendEmail' => Env::get('APP_SEND_EMAIL', false), // allow to send real email or not
147
                
148 3
                'dir' => [
149
                    // project
150 3
                    'root' => Env::get('APP_ROOT_PATH', defined('ROOT_PATH') ? ROOT_PATH ?: getcwd() : getcwd()),
151 3
                    'vendor' => Env::get('APP_VENDOR_PATH', VENDOR_PATH),
152 3
                    'app' => Env::get('APP_PATH', APP_PATH . '/'),
153 3
                    'public' => Env::get('APP_PUBLIC_PATH', getcwd()),
154
                    
155
                    // app
156 3
                    'bootstrap' => Env::get('APP_BOOTSTRAP_PATH', APP_PATH . '/Bootstrap/'),
157 3
                    'common' => Env::get('APP_COMMON_PATH', APP_PATH . '/Common/'),
158 3
                    'config' => Env::get('APP_CONFIG_PATH', APP_PATH . '/Config/'),
159 3
                    'modules' => Env::get('APP_MODULES_PATH', APP_PATH . '/Modules/'),
160 3
                    'plugins' => Env::get('APP_PLUGINS_PATH', APP_PATH . '/Plugins/'),
161 3
                    'private' => PRIVATE_PATH,
162
                    
163
                    // private
164 3
                    'cache' => Env::get('APP_CACHE_PATH', PRIVATE_PATH . '/cache/'),
165 3
                    'log' => Env::get('APP_LOG_PATH', PRIVATE_PATH . '/log/'),
166 3
                    'files' => Env::get('APP_FILE_PATH', PRIVATE_PATH . '/files/'),
167 3
                    'trash' => Env::get('APP_TRASH_PATH', PRIVATE_PATH . '/trash/'),
168 3
                    'tmp' => Env::get('APP_TMP_PATH', PRIVATE_PATH . '/tmp/'),
169 3
                    'migrations' => Env::get('APP_MIGRATION_PATH', PRIVATE_PATH . '/migrations/'),
170 3
                ],
171 3
            ],
172
            
173 3
            'url' => [
174 3
                'staticBaseUri' => Env::get('URL_STATIC_BASE_URI', null),
175 3
                'baseUri' => Env::get('URL_BASE_URI', '/'),
176 3
                'basePath' => Env::get('URL_BASE_PATH', '/'),
177 3
            ],
178
            
179 3
            'php' => [
180 3
                'locale' => [
181 3
                    'category' => Env::get('PHP_LOCALE_CATEGORY', LC_ALL),
182 3
                    'rest' => explode(',', Env::get('PHP_LOCALE_REST', 'fr_CA.UTF-8,French_Canada.1252')),
183 3
                ],
184 3
                'date' => [
185 3
                    'timezone' => Env::get('PHP_DATE_TIMEZONE', 'America/Montreal'),
186 3
                ],
187 3
                'ini' => [
188 3
                    'zend.exception_ignore_args' => Env::get('PHP_INI_ZEND_EXCEPTION_IGNORE_ARGS', 'On'),
189 3
                ],
190 3
            ],
191
            
192
            /**
193
             * Debug Configuration
194
             */
195 3
            'debug' => [
196 3
                'enable' => Env::get('DEBUG_ENABLE', false),
197 3
                'exception' => Env::get('DEBUG_EXCEPTION', true),
198 3
                'lowSeverity' => Env::get('DEBUG_LOW_SEVERITY', false),
199 3
                'showFiles' => Env::get('DEBUG_SHOW_FILES', true),
200 3
                'showBackTrace' => Env::get('DEBUG_SHOW_BACKTRACE', true),
201 3
                'showFileFragment' => Env::get('DEBUG_SHOW_FRAGMENT', true),
202 3
                'uri' => Env::get('DEBUG_URI'),
203 3
                'blacklist' => [
204 3
                    'server' => [
205 3
                        'PWD',
206 3
                        'PASS',
207 3
                        'PASSWD',
208 3
                        'PASSWORD',
209 3
                        'TOKEN',
210 3
                        'HASH',
211 3
                        'DB_PWD',
212 3
                        'DB_PASS',
213 3
                        'DB_PASSWD',
214 3
                        'DB_PASSWORD',
215 3
                        'DATABASE_PWD',
216 3
                        'DATABASE_PASS',
217 3
                        'DATABASE_PASSWD',
218 3
                        'DATABASE_PASSWORD',
219 3
                        'SECURITY_WORK_FACTOR',
220 3
                        'SECURITY_SALT',
221 3
                        'PASSPHRASE',
222 3
                        'SECRET',
223 3
                        'API_SECRET',
224 3
                        'API_KEY',
225 3
                    ],
226 3
                ],
227 3
            ],
228
            
229
            /**
230
             * Response Provider Configuration
231
             * - Set default security headers
232
             */
233 3
            'response' => [
234 3
                'headers' => [
235 3
                    'Content-Security-Policy-Report-Only' => Env::get('RESPONSE_HEADER_CSP_REPORT_ONLY', "default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; object-src 'none'; connect-src 'self';"),
236 3
                    'Strict-Transport-Security' => Env::get('RESPONSE_HEADER_STRICT_TRANSPORT_SECURITY', 'max-age=63072000; includeSubDomains; preload'),
237 3
                    'X-Content-Type-Options' => Env::get('RESPONSE_HEADER_CONTENT_TYPE_OPTIONS', 'nosniff'),
238 3
                    'X-Frame-Options' => Env::get('RESPONSE_HEADER_FRAME_OPTIONS', 'Deny'),
239 3
                    'X-XSS-Protection' => Env::get('RESPONSE_HEADER_XSS_PROTECTION', 0),
240 3
                ],
241 3
                'corsHeaders' => [
242 3
                    'Access-Control-Allow-Origin' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN', '*'),
243 3
                    'Access-Control-Allow-Methods' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_METHODS', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'),
244 3
                    'Access-Control-Allow-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_HEADERS', 'Origin, X-Requested-With, Content-Range, Content-Disposition, Content-Type, Authorization'),
245 3
                    'Access-Control-Allow-Credentials' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS', 'true'),
246 3
                    'Access-Control-Max-Age' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_MAX_AGE', '600'),
247 3
//                    'Access-Control-Expose-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS', '*'),
248 3
//                    'Access-Control-Request-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_REQUEST_HEADERS', ''),
249 3
//                    'Access-Control-Request-Method' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_REQUEST_METHOD', ''),
250 3
                ],
251 3
            ],
252
            
253
            /**
254
             * Identity Provider Configuration
255
             */
256 3
            'identity' => [
257 3
                'authorizationHeader' => Env::get('IDENTITY_AUTHORIZATION_HEADER', 'Authorization'),
258 3
                'adapter' => Env::get('IDENTITY_ADAPTER', 'session'), // session | database
259 3
                'mode' => Env::get('IDENTITY_SESSION_MODE', 'jwt'), // jwt | string
260 3
                'sessionKey' => Env::get('IDENTITY_SESSION_KEY', 'zemit-identity'),
261 3
                'sessionFallback' => Env::get('IDENTITY_SESSION_FALLBACK', false),
262 3
                'token' => [
263 3
                    'expiration' => $now->modify(Env::get('IDENTITY_TOKEN_EXPIRATION', '+1 day'))->getTimestamp(),
264 3
                ],
265 3
                'refreshToken' => [
266 3
                    'expiration' => $now->modify(Env::get('IDENTITY_REFRESH_TOKEN_EXPIRATION', '+7 day'))->getTimestamp(),
267 3
                ],
268 3
            ],
269
            
270
            /**
271
             *
272
             */
273 3
            'models' => [
274
                
275
                // Base system
276 3
                Models\Backup::class => Models\Backup::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\Backup was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
277 3
                Models\Audit::class => Models\Audit::class,
278 3
                Models\AuditDetail::class => Models\AuditDetail::class,
279 3
                Models\Log::class => Models\Log::class,
280 3
                Models\Email::class => Models\Email::class,
281 3
                Models\Job::class => Models\Job::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\Job was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
282 3
                Models\File::class => Models\File::class,
283 3
                Models\Session::class => Models\Session::class,
284 3
                Models\Flag::class => Models\Flag::class,
285 3
                Models\Setting::class => Models\Setting::class,
286
                
287
                // Translate
288 3
                Models\Lang::class => Models\Lang::class,
289 3
                Models\Translate::class => Models\Translate::class,
290 3
                Models\TranslateField::class => Models\TranslateField::class,
291 3
                Models\TranslateTable::class => Models\TranslateTable::class,
292
                
293
                // Site & CMS
294 3
                Models\Site::class => Models\Site::class,
295 3
                Models\SiteLang::class => Models\SiteLang::class,
296 3
                Models\Page::class => Models\Page::class,
297 3
                Models\Post::class => Models\Post::class,
298 3
                Models\Template::class => Models\Template::class,
299 3
                Models\Channel::class => Models\Channel::class,
300 3
                Models\Field::class => Models\Field::class,
301
                
302
                // User & Permissions
303 3
                Models\Profile::class => Models\Profile::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\Profile was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
304 3
                Models\User::class => Models\User::class,
305 3
                Models\UserType::class => Models\UserType::class,
306 3
                Models\UserGroup::class => Models\UserGroup::class,
307 3
                Models\UserRole::class => Models\UserRole::class,
308 3
                Models\UserFeature::class => Models\UserFeature::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\UserFeature was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
309
                
310
                // Role
311 3
                Models\Role::class => Models\Role::class,
312 3
                Models\RoleRole::class => Models\RoleRole::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\RoleRole was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
313 3
                Models\RoleFeature::class => Models\RoleFeature::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\RoleFeature was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
314
                
315
                // Group
316 3
                Models\Group::class => Models\Group::class,
317 3
                Models\GroupRole::class => Models\GroupRole::class,
318 3
                Models\GroupType::class => Models\GroupType::class,
319 3
                Models\GroupFeature::class => Models\GroupFeature::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\GroupFeature was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
320
                
321
                // Type
322 3
                Models\Type::class => Models\Type::class,
323
                
324
                // Feature
325 3
                Models\Feature::class => Models\Feature::class,
0 ignored issues
show
Bug introduced by
The type Zemit\Models\Feature was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
326 3
            ],
327
            
328
            /**
329
             * Service Provider Configuration
330
             */
331 3
            'providers' => [
332
                // abstract => concrete
333 3
                Provider\Env\ServiceProvider::class => Env::get('PROVIDER_ENVIRONMENT', Provider\Env\ServiceProvider::class),
334 3
                Provider\Security\ServiceProvider::class => Env::get('PROVIDER_SECURITY', Provider\Security\ServiceProvider::class),
335 3
                Provider\Session\ServiceProvider::class => Env::get('PROVIDER_SESSION', Provider\Session\ServiceProvider::class),
336 3
                Provider\Cookies\ServiceProvider::class => Env::get('PROVIDER_COOKIES', Provider\Cookies\ServiceProvider::class),
337
                
338 3
                Provider\Locale\ServiceProvider::class => Env::get('PROVIDER_LOCALE', Provider\Locale\ServiceProvider::class),
339 3
                Provider\Translate\ServiceProvider::class => Env::get('PROVIDER_TRANSLATE', Provider\Translate\ServiceProvider::class),
340 3
                Provider\Url\ServiceProvider::class => Env::get('PROVIDER_URL', Provider\Url\ServiceProvider::class),
341 3
                Provider\Request\ServiceProvider::class => Env::get('PROVIDER_REQUEST', Provider\Request\ServiceProvider::class),
342 3
                Provider\Response\ServiceProvider::class => Env::get('PROVIDER_RESPONSE', Provider\Response\ServiceProvider::class),
343 3
                Provider\Router\ServiceProvider::class => Env::get('PROVIDER_ROUTER', Provider\Router\ServiceProvider::class),
344 3
                Provider\Dispatcher\ServiceProvider::class => Env::get('PROVIDER_DISPATCHER', Provider\Dispatcher\ServiceProvider::class),
345 3
                Provider\Volt\ServiceProvider::class => Env::get('PROVIDER_VOLT', Provider\Volt\ServiceProvider::class),
346 3
                Provider\View\ServiceProvider::class => Env::get('PROVIDER_VIEW', Provider\View\ServiceProvider::class),
347
                
348 3
                Provider\Profiler\ServiceProvider::class => Env::get('PROVIDER_PROFILER', Provider\Profiler\ServiceProvider::class),
349 3
                Provider\Database\ServiceProvider::class => Env::get('PROVIDER_DATABASE', Provider\Database\ServiceProvider::class),
350 3
                Provider\DatabaseReadOnly\ServiceProvider::class => Env::get('PROVIDER_DATABASE_READ_ONLY', Provider\DatabaseReadOnly\ServiceProvider::class),
351 3
                Provider\Annotations\ServiceProvider::class => Env::get('PROVIDER_ANNOTATIONS', Provider\Annotations\ServiceProvider::class),
352 3
                Provider\ModelsManager\ServiceProvider::class => Env::get('PROVIDER_MODELS_MANAGER', Provider\ModelsManager\ServiceProvider::class),
353 3
                Provider\ModelsMetadata\ServiceProvider::class => Env::get('PROVIDER_MODELS_METADATA', Provider\ModelsMetadata\ServiceProvider::class),
354 3
                Provider\ModelsCache\ServiceProvider::class => Env::get('PROVIDER_MODELS_CACHE', Provider\ModelsCache\ServiceProvider::class),
355 3
                Provider\Cache\ServiceProvider::class => Env::get('PROVIDER_CACHE', Provider\Cache\ServiceProvider::class),
356 3
                Provider\Mailer\ServiceProvider::class => Env::get('PROVIDER_MAILER', Provider\Mailer\ServiceProvider::class),
357 3
                Provider\Logger\ServiceProvider::class => Env::get('PROVIDER_LOGGER', Provider\Logger\ServiceProvider::class),
358 3
                Provider\FileSystem\ServiceProvider::class => Env::get('PROVIDER_FILE_SYSTEM', Provider\FileSystem\ServiceProvider::class),
359
                
360 3
                Provider\Assets\ServiceProvider::class => Env::get('PROVIDER_ASSETS', Provider\Assets\ServiceProvider::class),
361 3
                Provider\Tag\ServiceProvider::class => Env::get('PROVIDER_TAG', Provider\Tag\ServiceProvider::class),
362 3
                Provider\Filter\ServiceProvider::class => Env::get('PROVIDER_FILTER', Provider\Filter\ServiceProvider::class),
363 3
                Provider\Flash\ServiceProvider::class => Env::get('PROVIDER_FLASH', Provider\Flash\ServiceProvider::class),
364 3
                Provider\Escaper\ServiceProvider::class => Env::get('PROVIDER_ESCAPER', Provider\Escaper\ServiceProvider::class),
365 3
                Provider\Markdown\ServiceProvider::class => Env::get('PROVIDER_MARKDOWN', Provider\Markdown\ServiceProvider::class),
366 3
                Provider\Utils\ServiceProvider::class => Env::get('PROVIDER_UTILS', Provider\Utils\ServiceProvider::class),
367 3
                Provider\Crypt\ServiceProvider::class => Env::get('PROVIDER_CRYPT', Provider\Crypt\ServiceProvider::class),
368
                
369
                // oauth2
370 3
                Provider\Identity\ServiceProvider::class => Env::get('PROVIDER_IDENTITY', Provider\Identity\ServiceProvider::class),
371 3
                Provider\Oauth2Facebook\ServiceProvider::class => Env::get('PROVIDER_OAUTH_2_FACEBOOK', Provider\Oauth2Facebook\ServiceProvider::class),
372 3
                Provider\Oauth2Google\ServiceProvider::class => Env::get('PROVIDER_OAUTH_2_GOOGLE', Provider\Oauth2Google\ServiceProvider::class),
373
                
374
                // lib
375 3
                Provider\Aws\ServiceProvider::class => Env::get('PROVIDER_AWS', Provider\Aws\ServiceProvider::class),
376 3
                Provider\OCR\ServiceProvider::class => Env::get('PROVIDER_OCR', Provider\OCR\ServiceProvider::class),
377 3
                Provider\Jwt\ServiceProvider::class => Env::get('PROVIDER_JWT', Provider\Jwt\ServiceProvider::class),
378 3
                Provider\V8js\ServiceProvider::class => Env::get('PROVIDER_V8_JS', Provider\V8js\ServiceProvider::class),
379 3
                Provider\ReCaptcha\ServiceProvider::class => Env::get('PROVIDER_CAPTCHA', Provider\ReCaptcha\ServiceProvider::class),
380 3
                Provider\Gravatar\ServiceProvider::class => Env::get('PROVIDER_GRAVATAR', Provider\Gravatar\ServiceProvider::class),
381 3
                Provider\Clamav\ServiceProvider::class => Env::get('PROVIDER_CLAMAV', Provider\Clamav\ServiceProvider::class),
382 3
                Provider\Imap\ServiceProvider::class => Env::get('PROVIDER_IMAP', Provider\Imap\ServiceProvider::class),
383 3
                Provider\OpenAi\ServiceProvider::class => Env::get('PROVIDER_OPENAI', Provider\OpenAi\ServiceProvider::class),
384 3
                Provider\LoremIpsum\ServiceProvider::class => Env::get('PROVIDER_LOREM_IPSUM', Provider\LoremIpsum\ServiceProvider::class),
385 3
//                Snowair\Debugbar\ServiceProvider::class => \Snowair\Debugbar\ServiceProvider::class,
386 3
            ],
387
            
388
            /**
389
             * Logger Configuration
390
             */
391 3
            'logger' => [
392 3
                'enable' => Env::get('LOGGER_ENABLE', false),
393
                
394 3
                'error' => Env::get('LOGGER_ERROR', false),
395 3
                'database' => Env::get('LOGGER_DATABASE', false),
396 3
                'dispatcher' => Env::get('LOGGER_DISPATCHER', false),
397 3
                'profiler' => Env::get('LOGGER_PROFILER', false),
398 3
                'mailer' => Env::get('LOGGER_MAILER', false),
399 3
                'cron' => Env::get('LOGGER_CRON', false),
400 3
                'auth' => Env::get('LOGGER_AUTH', false),
401
                
402 3
                'driver' => explode(',', Env::get('LOGGER_DRIVER', 'noop')),
403 3
                'drivers' => [
404 3
                    'noop' => [
405 3
                        'adapter' => \Phalcon\Logger\Adapter\Noop::class,
406 3
                    ],
407 3
                    'stream' => [
408 3
                        'adapter' => \Phalcon\Logger\Adapter\Stream::class,
409 3
                    ],
410 3
                    'syslog' => [
411 3
                        'adapter' => \Phalcon\Logger\Adapter\Syslog::class,
412 3
                    ],
413 3
                ],
414 3
                'default' => [
415 3
                    'path' => Env::get('LOGGER_PATH', PRIVATE_PATH . '/log/'),
416 3
                    'format' => Env::get('LOGGER_FORMAT', '[%date%][%type%] %message%'),
417 3
                    'date' => Env::get('LOGGER_DATE', 'Y-m-d H:i:s'),
418 3
                    'filename' => Env::get('LOGGER_DEFAULT_FILENAME', 'zemit'),
419 3
                ],
420 3
            ],
421
            
422
            /**
423
             * Default filters
424
             */
425 3
            'filters' => [
426 3
                Filter::FILTER_MD5 => Filters\Md5::class,
427 3
                Filter::FILTER_JSON => Filters\Json::class,
428 3
                Filter::FILTER_IPV4 => Filters\IPv4::class,
429 3
                Filter::FILTER_IPV6 => Filters\IPv6::class,
430 3
            ],
431
            
432
            /**
433
             * Default modules
434
             * @todo change this to class => [class => '', path => '']
435
             */
436 3
            'modules' => [
437 3
                \Zemit\Mvc\Module::NAME_FRONTEND => [
438 3
                    'className' => \Zemit\Modules\Frontend\Module::class,
439 3
                    'path' => CORE_PATH . 'Modules/Frontend/Module.php',
440 3
                ],
441 3
                \Zemit\Mvc\Module::NAME_ADMIN => [
442 3
                    'className' => \Zemit\Modules\Admin\Module::class,
443 3
                    'path' => CORE_PATH . 'Modules/Admin/Module.php',
444 3
                ],
445 3
                \Zemit\Mvc\Module::NAME_API => [
446 3
                    'className' => \Zemit\Modules\Api\Module::class,
447 3
                    'path' => CORE_PATH . 'Modules/Api/Module.php',
448 3
                ],
449 3
                \Zemit\Mvc\Module::NAME_OAUTH2 => [
450 3
                    'className' => \Zemit\Modules\Oauth2\Module::class,
451 3
                    'path' => CORE_PATH . 'Modules/Oauth2/Module.php',
452 3
                ],
453 3
                \Zemit\Cli\Module::NAME_CLI => [
454 3
                    'className' => \Zemit\Modules\Cli\Module::class,
455 3
                    'path' => CORE_PATH . 'Modules/Cli/Module.php',
456 3
                ],
457 3
                /**
458 3
                 * @TODO support this way too
459 3
                 */
460 3
//                \Zemit\Modules\Frontend\Module::class => \Zemit\Modules\Frontend\Module::class,
461 3
//                \Zemit\Modules\Admin\Module::class => \Zemit\Modules\Admin\Module::class,
462 3
//                \Zemit\Modules\Api\Module::class => \Zemit\Modules\Api\Module::class,
463 3
//                \Zemit\Modules\Cli\Module::class => \Zemit\Modules\Cli\Module::class,
464 3
            ],
465
            
466
            /**
467
             * Default router settings
468
             */
469 3
            'router' => [
470 3
                'hostnames' => [],
471 3
                'defaults' => [
472 3
                    'namespace' => Env::get('ROUTER_DEFAULT_NAMESPACE', 'Zemit\\Modules\\Frontend\\Controllers'),
473 3
                    'module' => Env::get('ROUTER_DEFAULT_MODULE', 'frontend'),
474 3
                    'controller' => Env::get('ROUTER_DEFAULT_CONTROLLER', 'index'),
475 3
                    'action' => Env::get('ROUTER_DEFAULT_ACTION', 'index'),
476 3
                ],
477 3
                'cli' => [
478 3
                    'namespace' => Env::get('ROUTER_DEFAULT_NAMESPACE', 'Zemit\\Modules\\Cli\\Tasks'),
479 3
                    'module' => Env::get('ROUTER_DEFAULT_MODULE', 'cli'),
480 3
                    'task' => Env::get('ROUTER_DEFAULT_TASK', 'help'),
481 3
                    'action' => Env::get('ROUTER_DEFAULT_ACTION', 'main'),
482 3
                ],
483 3
                'notFound' => [
484 3
                    'namespace' => Env::get('ROUTER_NOTFOUND_NAMESPACE', null),
485 3
                    'module' => Env::get('ROUTER_NOTFOUND_MODULE', null),
486 3
                    'controller' => Env::get('ROUTER_NOTFOUND_CONTROLLER', 'error'),
487 3
                    'task' => Env::get('ROUTER_NOTFOUND_CONTROLLER', 'error'),
488 3
                    'action' => Env::get('ROUTER_NOTFOUND_ACTION', 'notFound'),
489 3
                ],
490 3
                'fatal' => [
491 3
                    'namespace' => Env::get('ROUTER_FATAL_NAMESPACE', null),
492 3
                    'module' => Env::get('ROUTER_FATAL_MODULE', null),
493 3
                    'controller' => Env::get('ROUTER_FATAL_CONTROLLER', 'error'),
494 3
                    'task' => Env::get('ROUTER_FATAL_CONTROLLER', 'error'),
495 3
                    'action' => Env::get('ROUTER_FATAL_ACTION', 'fatal'),
496 3
                ],
497 3
                'forbidden' => [
498 3
                    'namespace' => Env::get('ROUTER_MAINTENANCE_NAMESPACE', null),
499 3
                    'module' => Env::get('ROUTER_MAINTENANCE_MODULE', null),
500 3
                    'controller' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
501 3
                    'task' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
502 3
                    'action' => Env::get('ROUTER_MAINTENANCE_ACTION', 'forbidden'),
503 3
                ],
504 3
                'unauthorized' => [
505 3
                    'namespace' => Env::get('ROUTER_MAINTENANCE_NAMESPACE', null),
506 3
                    'module' => Env::get('ROUTER_MAINTENANCE_MODULE', null),
507 3
                    'controller' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
508 3
                    'task' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
509 3
                    'action' => Env::get('ROUTER_MAINTENANCE_ACTION', 'unauthorized'),
510 3
                ],
511 3
                'maintenance' => [
512 3
                    'namespace' => Env::get('ROUTER_MAINTENANCE_NAMESPACE', null),
513 3
                    'module' => Env::get('ROUTER_MAINTENANCE_MODULE', null),
514 3
                    'controller' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
515 3
                    'task' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
516 3
                    'action' => Env::get('ROUTER_MAINTENANCE_ACTION', 'maintenance'),
517 3
                ],
518 3
                'error' => [
519 3
                    'namespace' => Env::get('ROUTER_ERROR_NAMESPACE', null),
520 3
                    'module' => Env::get('ROUTER_ERROR_MODULE', null),
521 3
                    'controller' => Env::get('ROUTER_ERROR_CONTROLLER', 'error'),
522 3
                    'task' => Env::get('ROUTER_ERROR_CONTROLLER', 'error'),
523 3
                    'action' => Env::get('ROUTER_ERROR_ACTION', 'index'),
524 3
                ],
525 3
            ],
526
    
527
            /**
528
             * View Configuration
529
             */
530 3
            'view' => [
531 3
                'minify' => Env::get('VIEW_MINIFY', false),
532 3
                'engines' => Env::get('VIEW_ENGINES', [
533 3
                    '.phtml' => \Phalcon\Mvc\View\Engine\Php::class,
534 3
                    '.volt' => \Phalcon\Mvc\View\Engine\Volt::class,
535 3
//                    '.mhtml' => \Phalcon\Mvc\View\Engine\Mustache::class,
536 3
//                    '.twig' => \Phalcon\Mvc\View\Engine\Twig::class,
537 3
//                    '.tpl' => \Phalcon\Mvc\View\Engine\Smarty::class
538 3
                ]),
539 3
            ],
540
    
541
            /**
542
             * Volt Configuration
543
             */
544 3
            'volt' => [
545 3
                'autoescape' => Env::get('VOLT_AUTOESCAPE', false),
546 3
                'always' => Env::get('VOLT_ALWAYS', false),
547 3
                'extension' => Env::get('VOLT_EXTENSION', '.php'),
548 3
                'separator' => Env::get('VOLT_SEPARATOR', '%%'),
549 3
                'path' => Env::get('VOLT_PATH', './'),
550 3
                'prefix' => Env::get('VOLT_PREFIX', null),
551 3
                'stat' => Env::get('VOLT_STAT', true), // Whether Phalcon must check if there are differences between the template file and its compiled path
552 3
            ],
553
            
554
            /**
555
             * Gravatar Configuration
556
             */
557 3
            'gravatar' => [
558 3
                'default_image' => Env::get('GRAVATAR_DEFAULT_IMAGE', 'identicon'),
559 3
                'size' => Env::get('GRAVATAR_SIZE', 24),
560 3
                'rating' => Env::get('GRAVATAR_RATING', 'pg'),
561 3
                'use_https' => Env::get('GRAVATAR_HTPPS', true),
562 3
            ],
563
            
564
            /**
565
             * reCaptcha Configuration
566
             */
567 3
            'reCaptcha' => [
568 3
                'siteKey' => Env::get('RECAPTCHA_KEY'),
569 3
                'secret' => Env::get('RECAPTCHA_SECRET'),
570 3
                'expectedHostname' => Env::get('RECAPTCHA_EXPECTED_HOSTNAME'),
571 3
                'expectedApkPackageName' => Env::get('RECAPTCHA_EXPECTED_APK_PACKAGE_NAME'),
572 3
                'expectedAction' => Env::get('RECAPTCHA_EXPECTED_ACTION', null),
573 3
                'scoreThreshold' => Env::get('RECAPTCHA_SCORE_THRESHOLD', 0.5),
574 3
            ],
575
            
576
            /**
577
             * Locale Service Settings
578
             */
579 3
            'locale' => [
580 3
                'default' => Env::get('LOCALE_DEFAULT', 'en'),
581 3
                'sessionKey' => Env::get('LOCALE_SESSION_KEY', 'zemit-locale'),
582 3
                'mode' => Env::get('LOCALE_MODE', Locale::MODE_SESSION_GEOIP),
583 3
                'allowed' => explode(',', Env::get('LOCALE_ALLOWED', 'en')),
584 3
            ],
585
            
586
            /**
587
             * Translate Service Settings
588
             */
589 3
            'translate' => [
590 3
                'locale' => Env::get('TRANSLATE_LOCALE', 'en_US.utf8'),
591 3
                'defaultDomain' => Env::get('TRANSLATE_DEFAULT_DOMAIN', 'messages'),
592 3
                'category' => Env::get('TRANSLATE_CATEGORY', LC_MESSAGES),
593 3
                'directory' => [
594 3
                    Env::get('TRANSLATE_DEFAULT_DOMAIN', 'messages') => Env::get('TRANSLATE_DEFAULT_PATH', CORE_PATH . 'Locales'),
595 3
                ],
596 3
            ],
597
            
598
            /**
599
             * Default Session Configuration
600
             */
601 3
            'session' => [
602 3
                'driver' => Env::get('SESSION_DRIVER', 'stream'),
603 3
                'drivers' => [
604 3
                    'stream' => [
605 3
                        'adapter' => Env::get('SESSION_STREAM_ADAPTER', \Phalcon\Session\Adapter\Stream::class),
606 3
                        'savePath' => Env::get('SESSION_STREAM_SAVE_PATH', '/tmp'),
607 3
                    ],
608 3
                    'memcached' => [
609 3
                        'adapter' => Env::get('SESSION_MEMCACHED_ADAPTER', \Phalcon\Session\Adapter\Libmemcached::class),
610 3
                        'servers' => [
611 3
                            [
612 3
                                'host' => Env::get('SESSION_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
613 3
                                'port' => Env::get('SESSION_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
614 3
                                'weight' => Env::get('SESSION_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
615 3
                            ],
616 3
                        ],
617 3
                        'client' => [],
618 3
                    ],
619 3
                    'redis' => [
620 3
                        'adapter' => Env::get('SESSION_REDIS_ADAPTER', \Phalcon\Session\Adapter\Redis::class),
621 3
                        'defaultSerializer' => Env::get('SESSION_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
622 3
                        'lifetime' => Env::get('SESSION_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
623 3
                        'serializer' => Env::get('SESSION_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
624 3
                        'host' => Env::get('SESSION_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
625 3
                        'port' => Env::get('SESSION_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
626 3
                        'index' => Env::get('SESSION_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
627 3
                        'auth' => Env::get('SESSION_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
628 3
                        'persistent' => Env::get('SESSION_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', 0)),
629 3
                        'socket' => Env::get('SESSION_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
630 3
                    ],
631 3
                    'noop' => [
632 3
                        'adapter' => Env::get('SESSION_NOOP_ADAPTER', \Phalcon\Session\Adapter\Noop::class),
633 3
                    ],
634 3
                ],
635 3
                'default' => [
636 3
                    'prefix' => Env::get('SESSION_PREFIX', 'zemit_session_'),
637 3
                    'uniqueId' => Env::get('SESSION_UNIQUE_ID', 'zemit_'),
638 3
                    'lifetime' => Env::get('SESSION_LIFETIME', 3600),
639 3
                ],
640 3
                'ini' => [
641 3
                    'session.save_path' => Env::get('SESSION_SAVE_PATH', ''),
642 3
                    'session.name' => Env::get('SESSION_NAME', 'PHPSESSID'),
643 3
                    'session.save_handler' => Env::get('SESSION_SAVE_HANDLER', 'files'),
644 3
                    'session.auto_start' => Env::get('SESSION_AUTO_START', '0'),
645 3
                    'session.gc_probability' => Env::get('SESSION_GC_PROBABILITY', '1'),
646 3
                    'session.gc_divisor' => Env::get('SESSION_GC_DIVISOR', '100'),
647 3
                    'session.gc_maxlifetime' => Env::get('SESSION_GC_MAXLIFETIME', '1440'),
648 3
                    'session.serialize_handler' => Env::get('SESSION_SERIALIZE_HANDLER', 'php'),
649 3
                    'session.cookie_lifetime' => Env::get('SESSION_COOKIE_LIFETIME', '0'),
650 3
                    'session.cookie_path' => Env::get('SESSION_COOKIE_PATH', '/'),
651 3
                    'session.cookie_domain' => Env::get('SESSION_COOKIE_DOMAIN', ''),
652 3
                    'session.cookie_secure' => Env::get('SESSION_COOKIE_SECURE', '1'),
653 3
                    'session.cookie_httponly' => Env::get('SESSION_COOKIE_HTTPONLY', '1'),
654 3
                    'session.cookie_samesite' => Env::get('SESSION_COOKIE_SAMESITE', ''),
655 3
                    'session.use_strict_mode' => Env::get('SESSION_USE_STRICT_MODE', '0'),
656 3
                    'session.use_cookies' => Env::get('SESSION_USE_COOKIES', '1'),
657 3
                    'session.use_only_cookies' => Env::get('SESSION_USE_ONLY_COOKIES', '1'),
658 3
                    'session.referer_check' => Env::get('SESSION_REFERER_CHECK', ''),
659 3
                    'session.cache_limiter' => Env::get('SESSION_CACHE_LIMITER', 'nocache'),
660 3
                    'session.cache_expire' => Env::get('SESSION_CACHE_EXPIRE', '180'),
661 3
                    'session.use_trans_sid' => Env::get('SESSION_USE_TRANS_SID', '0'),
662 3
                    'session.trans_sid_tags' => Env::get('SESSION_TRANS_SID_TAGS', 'a=href,area=href,frame=src,form='),
663 3
                    'session.trans_sid_hosts' => Env::get('SESSION_TRANS_SID_HOSTS', $_SERVER['HTTP_HOST'] ?? ''),
664 3
                    'session.sid_length' => Env::get('SESSION_SID_LENGTH', '32'),
665 3
                    'session.sid_bits_per_character' => Env::get('SESSION_SID_BITS_PER_CHARACTER', '4'),
666 3
                    'session.upload_progress.enabled' => Env::get('SESSION_UPLOAD_PROGRESS_ENABLED', '1'),
667 3
                    'session.upload_progress.cleanup' => Env::get('SESSION_UPLOAD_PROGRESS_CLEANUP', '1'),
668 3
                    'session.upload_progress.prefix' => Env::get('SESSION_UPLOAD_PROGRESS_PREFIX', 'upload_progress_'),
669 3
                    'session.upload_progress.name' => Env::get('SESSION_UPLOAD_PROGRESS_NAME', 'PHP_SESSION_UPLOAD_PROGRESS'),
670 3
                    'session.upload_progress.freq' => Env::get('SESSION_UPLOAD_PROGRESS_FREQ', '1%'),
671 3
                    'session.upload_progress.min_freq' => Env::get('SESSION_UPLOAD_PROGRESS_MIN_FREQ', '1'),
672 3
                    'session.lazy_write' => Env::get('SESSION_LAZY_WRITE', '1'),
673 3
                    'session.hash_function' => Env::get('SESSION_HASH_FUNCTION', '0'),
674 3
                    'session.hash_bits_per_character' => Env::get('SESSION_HASH_BITS_PER_CHARACTER', '4'),
675 3
                    'session.entropy_file' => Env::get('SESSION_ENTROPY_FILE', ''),
676 3
                    'session.entropy_length' => Env::get('SESSION_ENTROPY_LENGTH', '0'),
677 3
                ],
678 3
            ],
679
            
680
            /**
681
             * Default module/plugin structure
682
             */
683 3
            'module' => [
684 3
                'dir' => [
685
                    // default
686 3
                    'modules' => Env::get('MODULE_DIR_MODULES', 'Modules/'),
687 3
                    'controllers' => Env::get('MODULE_DIR_CONTROLLER', 'Controllers/'),
688 3
                    'tasks' => Env::get('MODULE_DIR_TASKS', 'Tasks/'),
689 3
                    'models' => Env::get('MODULE_DIR_MODELS', 'Models/'),
690 3
                    'views' => Env::get('MODULE_DIR_VIEWS', 'Views/'),
691 3
                    'bootstrap' => Env::get('MODULE_DIR_BOOTSTRAP', 'Bootstrap/'),
692 3
                    'locales' => Env::get('MODULE_DIR_LOCALES', 'Locales/'),
693 3
                    'config' => Env::get('MODULE_DIR_CONFIG', 'Config/'),
694
                    
695
                    // private
696 3
                    'migrations' => Env::get('MODULE_DIR_MIGRATION', 'Private/migrations/'),
697 3
                    'cache' => Env::get('MODULE_DIR_MIGRATION', 'Private/migrations/'),
698 3
                    'logs' => Env::get('MODULE_DIR_LOGS', 'Private/migrations/'),
699 3
                    'backups' => Env::get('MODULE_DIR_BACKUPS', 'Private/backups/'),
700 3
                    'files' => Env::get('MODULE_DIR_FILES', 'Private/files/'),
701 3
                    'trash' => Env::get('MODULE_DIR_TRASH', 'Private/trash/'),
702 3
                ],
703 3
            ],
704
            
705
            /**
706
             * Default security settings
707
             */
708 3
            'security' => [ // phalcon security config
709 3
                'workFactor' => Env::get('SECURITY_WORK_FACTOR', 12), // workfactor for the phalcon security service
710 3
                'hash' => Env::get('SECURITY_HASH', Security::CRYPT_SHA512), // set default hash to sha512
711 3
                'salt' => Env::get('SECURITY_SALT', '>mY.Db5fR?k%~<ZWf\}Zh35_IFC]#0Xx'), // salt for the phalcon security service
712 3
                'jwt' => [
713 3
                    'signer' => Env::get('SECURITY_JWT_SIGNER', \Phalcon\Security\JWT\Signer\Hmac::class),
714 3
                    'algo' => Env::get('SECURITY_JWT_ALGO', 'sha512'),
715 3
                    'contentType' => Env::get('SECURITY_JWT_CONTENT_TYPE', 'application/json'),
716 3
                    'expiration' => $now->modify(Env::get('SECURITY_JWT_EXPIRATION', '+1 day'))->getTimestamp(),
717 3
                    'notBefore' => $now->modify(Env::get('SECURITY_JWT_NOT_BEFORE', '-1 minute'))->getTimestamp(),
718 3
                    'issuedAt' => $now->modify(Env::get('SECURITY_JWT_ISSUED_AT', 'now'))->getTimestamp(),
719 3
                    'issuer' => Env::get('SECURITY_JWT_ISSUER', 'ZEMIT_CORE_DEFAULT_ISSUER'),
720 3
                    'audience' => Env::get('SECURITY_JWT_AUDIENCE', 'ZEMIT_CORE_DEFAULT_AUDIENCE'),
721 3
                    'id' => Env::get('SECURITY_JWT_ID', 'ZEMIT_CORE_DEFAULT_ID'),
722 3
                    'subject' => Env::get('SECURITY_JWT_SUBJECT', 'ZEMIT_CORE_DEFAULT_SUBJECT'),
723 3
                    'passphrase' => Env::get('SECURITY_JWT_PASSPHRASE', 'Tf0PHY/^yDdJs*~)?x#xCNj_N[jW/`c*'),
724 3
                ],
725 3
            ],
726
    
727
            /**
728
             * Default crypt settings
729
             */
730 3
            'crypt' => [
731 3
                'cipher' => Env::get('CRYPT_CIPHER', 'aes-256-cfb'),
732 3
                'useSigning' => Env::get('CRYPT_USE_SIGNING', false),
733 3
            ],
734
            
735
            /**
736
             * Cache drivers configs
737
             */
738 3
            'cache' => [
739 3
                'cli' => Env::get('CACHE_DRIVER_CLI', 'memory'),
740 3
                'driver' => Env::get('CACHE_DRIVER', 'memory'),
741 3
                'drivers' => [
742 3
                    'memory' => [
743 3
                        'adapter' => Env::get('CACHE_MEMORY_ADAPTER', \Phalcon\Cache\Adapter\Memory::class),
744 3
                    ],
745 3
                    'apcu' => [
746 3
                        'adapter' => Env::get('CACHE_APCU_ADAPTER', \Phalcon\Cache\Adapter\Apcu::class),
747 3
                    ],
748 3
                    'stream' => [
749 3
                        'adapter' => Env::get('CACHE_STREAM_ADAPTER', \Phalcon\Cache\Adapter\Stream::class),
750 3
                        'cacheDir' => Env::get('CACHE_STREAM_DIR', PRIVATE_PATH . '/cache/data/'),
751 3
                    ],
752 3
                    'memcached' => [
753 3
                        'adapter' => Env::get('CACHE_MEMCACHED_ADAPTER', \Phalcon\Cache\Adapter\Libmemcached::class),
754 3
                        'servers' => [
755 3
                            [
756 3
                                'host' => Env::get('CACHE_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
757 3
                                'port' => Env::get('CACHE_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
758 3
                                'weight' => Env::get('CACHE_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
759 3
                            ],
760 3
                        ],
761 3
                    ],
762 3
                    'redis' => [
763 3
                        'adapter' => Env::get('CACHE_REDIS_ADAPTER', \Phalcon\Cache\Adapter\Redis::class),
764 3
                        'defaultSerializer' => Env::get('CACHE_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
765 3
                        'lifetime' => Env::get('CACHE_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
766 3
                        'serializer' => Env::get('CACHE_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
767 3
                        'host' => Env::get('CACHE_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
768 3
                        'port' => Env::get('CACHE_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
769 3
                        'index' => Env::get('CACHE_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
770 3
                        'auth' => Env::get('CACHE_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
771 3
                        'persistent' => Env::get('CACHE_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', null)),
772 3
                        'socket' => Env::get('CACHE_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
773 3
                    ],
774 3
                ],
775 3
                'default' => [
776 3
                    'prefix' => Env::get('CACHE_PREFIX', 'zemit_cache_'),
777 3
                    'lifetime' => Env::get('CACHE_LIFETIME', 86400),
778 3
                    'defaultSerializer' => Env::get('CACHE_DEFAULT_SERIALIZER', 'Php'),
779 3
                ],
780 3
            ],
781
            
782
            /**
783
             * Metadata Configuration
784
             */
785 3
            'metadata' => [
786 3
                'driverCli' => Env::get('METADATA_DRIVER_CLI', 'memory'),
787 3
                'driver' => Env::get('METADATA_DRIVER', 'memory'),
788 3
                'drivers' => [
789 3
                    'apcu' => [
790 3
                        'adapter' => Env::get('METADATA_APCU_ADAPTER', \Phalcon\Mvc\Model\MetaData\Apcu::class),
791 3
                    ],
792 3
                    'memory' => [
793 3
                        'adapter' => Env::get('METADATA_MEMORY_ADAPTER', \Phalcon\Mvc\Model\MetaData\Memory::class),
794 3
                    ],
795 3
                    'stream' => [
796 3
                        'adapter' => Env::get('METADATA_STREAM_ADAPTER', \Phalcon\Mvc\Model\MetaData\Stream::class),
797 3
                        'metaDataDir' => Env::get('METADATA_STREAM_DIR', PRIVATE_PATH . '/cache/metadata/'),
798 3
                    ],
799 3
                    'memcached' => [
800 3
                        'adapter' => Env::get('METADATA_MEMCACHED_ADAPTER', \Phalcon\Mvc\Model\MetaData\Libmemcached::class),
801 3
                        'servers' => [
802 3
                            [
803 3
                                'host' => Env::get('METADATA_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
804 3
                                'port' => Env::get('METADATA_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
805 3
                                'weight' => Env::get('METADATA_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
806 3
                            ],
807 3
                        ],
808 3
                    ],
809 3
                    'redis' => [
810 3
                        'adapter' => Env::get('METADATA_REDIS_ADAPTER', \Phalcon\Mvc\Model\MetaData\Redis::class),
811 3
                        'defaultSerializer' => Env::get('METADATA_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
812 3
                        'lifetime' => Env::get('METADATA_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
813 3
                        'serializer' => Env::get('METADATA_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
814 3
                        'host' => Env::get('METADATA_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
815 3
                        'port' => Env::get('METADATA_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
816 3
                        'index' => Env::get('METADATA_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
817 3
                        'auth' => Env::get('METADATA_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
818 3
                        'persistent' => Env::get('METADATA_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', null)),
819 3
                        'socket' => Env::get('METADATA_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
820 3
                    ],
821 3
                    'wincache' => [
822 3
                        'adapter' => Env::get('METADATA_WINCACHE_ADAPTER', \Phalcon\Mvc\Model\MetaData\Wincache::class),
823 3
                    ],
824 3
                ],
825 3
                'default' => [
826 3
                    'lifetime' => Env::get('METADATA_LIFETIME', 172800),
827 3
                    'prefix' => Env::get('METADATA_PREFIX', 'zemit_metadata_'),
828 3
                ],
829 3
            ],
830
            
831
            /**
832
             * Annotations Configuration
833
             * - Memory
834
             * - Apcu
835
             * - Stream
836
             * - Memcached
837
             * - Redis
838
             * - Aerospike
839
             */
840 3
            'annotations' => [
841 3
                'driver' => Env::get('ANNOTATIONS_DRIVER', 'memory'),
842 3
                'drivers' => [
843 3
                    'memory' => [
844 3
                        'adapter' => Env::get('ANNOTATIONS_MEMORY_ADAPTER', \Phalcon\Annotations\Adapter\Memory::class),
845 3
                    ],
846 3
                    'apcu' => [
847 3
                        'adapter' => Env::get('ANNOTATIONS_APCU_ADAPTER', \Phalcon\Annotations\Adapter\Apcu::class),
848 3
                    ],
849 3
                    'file' => [
850 3
                        'adapter' => Env::get('ANNOTATIONS_STREAM_ADAPTER', \Phalcon\Annotations\Adapter\Stream::class),
851 3
                        'annotationsDir' => Env::get('ANNOTATIONS_STREAM_DIR', PRIVATE_PATH . '/cache/annotations'),
852 3
                    ],
853 3
                    'memcached' => [
854 3
                        'adapter' => Env::get('ANNOTATIONS_MEMCACHED_ADAPTER', \Phalcon\Annotations\Adapter\Memcached::class),
855 3
                        'servers' => [
856 3
                            [
857 3
                                'host' => Env::get('ANNOTATIONS_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
858 3
                                'port' => Env::get('ANNOTATIONS_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
859 3
                                'weight' => Env::get('ANNOTATIONS_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
860 3
                            ],
861 3
                        ],
862 3
                    ],
863 3
                    'redis' => [
864 3
                        'adapter' => Env::get('ANNOTATIONS_REDIS_ADAPTER', \Phalcon\Annotations\Adapter\Redis::class),
865 3
                        'defaultSerializer' => Env::get('ANNOTATIONS_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
866 3
                        'lifetime' => Env::get('ANNOTATIONS_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
867 3
                        'serializer' => Env::get('ANNOTATIONS_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
868 3
                        'host' => Env::get('ANNOTATIONS_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
869 3
                        'port' => Env::get('ANNOTATIONS_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
870 3
                        'index' => Env::get('ANNOTATIONS_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
871 3
                        'auth' => Env::get('ANNOTATIONS_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
872 3
                        'persistent' => Env::get('ANNOTATIONS_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', null)),
873 3
                        'socket' => Env::get('ANNOTATIONS_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
874 3
                    ],
875 3
                    'aerospike' => [
876 3
                        'adapter' => Env::get('ANNOTATIONS_AEROSPIKE_ADAPTER', \Phalcon\Annotations\Adapter\Aerospike::class),
877 3
                    ],
878 3
                ],
879 3
                'default' => [
880 3
                    'prefix' => Env::get('ANNOTATIONS_PREFIX', 'zemit_annotations_'),
881 3
                    'lifetime' => Env::get('ANNOTATIONS_LIFETIME', 86400),
882 3
                ],
883 3
            ],
884
            
885
            /**
886
             * Database configuration
887
             */
888 3
            'database' => [
889 3
                'default' => Env::get('DATABASE_ADAPTER', 'mysql'),
890 3
                'drivers' => [
891 3
                    'mysql' => [
892 3
                        'adapter' => Env::get('DATABASE_MYSQL_ADAPTER', \Phalcon\Db\Adapter\Pdo\Mysql::class),
893 3
                        'dialectClass' => Env::get('DATABASE_DIALECT_CLASS', \Zemit\Db\Dialect\Mysql::class),
894 3
                        'host' => Env::get('DATABASE_HOST', 'localhost'),
895 3
                        'port' => Env::get('DATABASE_PORT', 3306),
896 3
                        'dbname' => Env::get('DATABASE_DBNAME', ''),
897 3
                        'username' => Env::get('DATABASE_USERNAME', 'root'),
898 3
                        'password' => Env::get('DATABASE_PASSWORD', ''),
899 3
                        'charset' => Env::get('DATABASE_CHARSET', 'utf8'),
900 3
                        'options' => [
901 3
                            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . Env::get('DATABASE_CHARSET', 'utf8'),
902 3
                            PDO::ATTR_EMULATE_PREPARES => Env::get('DATABASE_PDO_EMULATE_PREPARES', false), // https://stackoverflow.com/questions/10113562/pdo-mysql-use-pdoattr-emulate-prepares-or-not
903 3
                            PDO::ATTR_STRINGIFY_FETCHES => Env::get('DATABASE_PDO_STRINGIFY_FETCHES', false),
904 3
                            PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => Env::get('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
905 3
                        ],
906
                        /**
907
                         * Readonly Configuration
908
                         */
909 3
                        'readonly' => [
910 3
                            'enable' => Env::get('DATABASE_READONLY_ENABLE', false),
911 3
                            'host' => Env::get('DATABASE_READONLY_HOST'),
912 3
                            'port' => Env::get('DATABASE_READONLY_PORT'),
913 3
                            'dbname' => Env::get('DATABASE_READONLY_DBNAME'),
914 3
                            'username' => Env::get('DATABASE_READONLY_USERNAME'),
915 3
                            'password' => Env::get('DATABASE_READONLY_PASSWORD'),
916 3
                            'charset' => Env::get('DATABASE_READONLY_CHARSET'),
917 3
                        ],
918 3
                    ],
919 3
                ],
920 3
            ],
921
            
922
            /**
923
             * Mailer configuration
924
             */
925 3
            'mailer' => [
926 3
                'driver' => Env::get('MAILER_DRIVER', 'sendmail'),
927 3
                'drivers' => [
928 3
                    'mail' => [
929 3
                        'driver' => 'mail',
930 3
                    ],
931 3
                    'sendmail' => [
932 3
                        'driver' => 'sendmail',
933 3
                        'sendmail' => Env::get('MAILER_SENDMAIL', '/usr/sbin/sendmail -bs'),
934 3
                    ],
935 3
                    'smtp' => [
936 3
                        'driver' => 'smtp',
937 3
                        'host' => Env::get('MAILER_SMTP_HOST', 'localhost'),
938 3
                        'port' => Env::get('MAILER_SMTP_PORT', 25),
939 3
                        'encryption' => Env::get('MAILER_SMTP_ENCRYPTION', ''),
940 3
                        'username' => Env::get('MAILER_SMTP_USERNAME', ''),
941 3
                        'password' => Env::get('MAILER_SMTP_PASSWORD', ''),
942 3
                    ],
943 3
                ],
944 3
                'default' => [
945 3
                    'charset' => Env::get('MAILER_CHARSET', 'utf-8'),
946 3
                    'viewsDir' => Env::get('MAILER_VIEWS_DIR', APP_PATH . '/Modules/Frontend/Views/'),
947 3
                    'baseUri' => Env::get('MAILER_BASE_URI', null),
948 3
                ],
949 3
                'from' => [
950 3
                    'email' => Env::get('MAILER_FROM_EMAIL', 'zemit@localhost'),
951 3
                    'name' => Env::get('MAILER_FROM_NAME', 'Zemit'),
952 3
                ],
953 3
                'to' => [...explode(',', Env::get('MAILER_TO_EMAIL', ''))],
954 3
                'cc' => [...explode(',', Env::get('MAILER_CC_EMAIL', ''))],
955 3
                'bcc' => [...explode(',', Env::get('MAILER_BCC_EMAIL', ''))],
956 3
            ],
957
            
958
            /**
959
             * Cookies
960
             */
961 3
            'cookies' => [
962 3
                'useEncryption' => Env::get('COOKIES_USE_ENCRYPTION', true),
963 3
                'signKey' => Env::get('COOKIES_SIGN_KEY', ''),
964 3
            ],
965
            
966
            /**
967
             * AWS - Amazon Web Service
968
             */
969 3
            'aws' => [
970 3
                'region' => Env::get('AWS_REGION', 'ca-central-1'),
971 3
                'version' => Env::get('AWS_VERSION', 'latest'),
972 3
                'credentials' => [
973 3
                    'key' => Env::get('AWS_CREDENTIALS_KEY', ''),
974 3
                    'secret' => Env::get('AWS_CREDENTIALS_SECRET', ''),
975 3
                ],
976 3
            ],
977
    
978
            /**
979
             * Facebook SDK
980
             */
981 3
            'facebook' => [
982
            
983 3
            ],
984
            
985
            /**
986
             * Oauth2
987
             */
988 3
            'oauth2' => [
989 3
                'client' => [
990 3
                    'clientId' => Env::get('OAUTH2_CLIENT_ID'),
991 3
                    'clientSecret' => Env::get('OAUTH2_CLIENT_SECRET'),
992 3
                    'redirectUri' => Env::get('OAUTH2_CLIENT_REDIRECT_URI', '/oauth2/client/redirect'),
993 3
                    'urlAuthorize' => Env::get('OAUTH2_CLIENT_URL_AUTHORIZE', '/oauth2/client/authorize'),
994 3
                    'urlAccessToken' => Env::get('OAUTH2_CLIENT_URL_ACCESS_TOKEN', '/oauth2/client/token'),
995 3
                    'urlResourceOwnerDetails' => Env::get('OAUTH2_CLIENT_URL_RESOURCE', '/oauth2/client/resource'),
996 3
                    'proxy' => Env::get('OAUTH2_CLIENT_PROXY', null),
997 3
                    'verify' => Env::get('OAUTH2_CLIENT_VERIFY', true),
998 3
                ],
999 3
                'facebook' => [
1000 3
                    'clientId' => Env::get('OAUTH2_FACEBOOK_CLIENT_ID'),
1001 3
                    'clientSecret' => Env::get('OAUTH2_FACEBOOK_CLIENT_SECRET'),
1002 3
                    'redirectUri' => Env::get('OAUTH2_FACEBOOK_CLIENT_REDIRECT_URI', '/oauth2/facebook/callback'),
1003 3
                    'graphApiVersion' => Env::get('OAUTH2_FACEBOOK_GRAPH_API_VERSION', 'v2.10'),
1004 3
                ],
1005 3
                'google' => [
1006 3
                    'clientId' => Env::get('OAUTH2_GOOGLE_CLIENT_ID'),
1007 3
                    'clientSecret' => Env::get('OAUTH2_GOOGLE_CLIENT_SECRET'),
1008 3
                    'redirectUri' => Env::get('OAUTH2_FACEBOOK_CLIENT_REDIRECT_URI', '/oauth2/google/callback'),
1009 3
                    'hostedDomain' => Env::get('OAUTH2_FACEBOOK_CLIENT_HOSTED_DOMAIN', null), // optional; used to restrict access to users on your G Suite/Google Apps for Business accounts
1010 3
                ],
1011 3
                'instagram' => [
1012
                
1013 3
                ],
1014 3
                'linked' => [
1015
                
1016 3
                ],
1017 3
                'twitter' => [
1018
                
1019 3
                ],
1020 3
                'github' => [
1021
                
1022 3
                ],
1023 3
                'apple' => [
1024
                
1025 3
                ],
1026 3
            ],
1027
            
1028 3
            'openai' => [
1029 3
                'secretKey' => Env::get('OPENAI_SECRET_KEY'),
1030 3
                'organizationId' => Env::get('OPENAI_ORGANIZATION_ID'),
1031 3
            ],
1032
            
1033
            /**
1034
             * Imap
1035
             * https://packagist.org/packages/php-imap/php-imap
1036
             */
1037 3
            'imap' => [
1038 3
                'path' => Env::get('IMAP_PATH'), // IMAP server and mailbox folder
1039 3
                'login' => Env::get('IMAP_LOGIN'), // Username for the before configured mailbox
1040 3
                'password' => Env::get('IMAP_PASSWORD'), // Password for the before configured username
1041 3
                'attachmentsDir' => Env::get('IMAP_ATTACHMENTS_DIR'), // Server encoding (optional)
1042 3
                'serverEncoding' => Env::get('IMAP_SERVER_ENCODING', 'UTF-8'), // Directory, where attachments will be saved (optional)
1043 3
                'trimImapPath' => Env::get('IMAP_TRIM_IMAP_PATH', true),   // Trim leading/ending whitespaces of IMAP path (optional)
1044 3
                'attachmentFilenameMode' => Env::get('IMAP_ATTACHMENT_FILENAME_MODE', false), // Attachment filename mode (optional; false = random filename; true = original filename)
1045 3
            ],
1046
            
1047
            /**
1048
             * Dotenv
1049
             */
1050 3
            'dotenv' => [
1051 3
                'filePath' => '',
1052 3
            ],
1053
            
1054
            /**
1055
             * Client config to pass to front-end
1056
             */
1057 3
            'client' => [],
1058
            
1059
            /**
1060
             * Application permissions
1061
             */
1062 3
            'permissions' => [
1063
                
1064
                /**
1065
                 * Feature permissions
1066
                 */
1067 3
                'features' => [
1068
                    
1069 3
                    'test' => [
1070 3
                        'components' => [
1071 3
                            Api\Controllers\TestController::class => ['*'],
1072 3
                        ],
1073 3
                    ],
1074
                    
1075 3
                    'base' => [
1076 3
                        'components' => [
1077 3
                            Api\Controllers\AuthController::class => ['get'],
1078 3
                            Models\Audit::class => ['create'],
1079 3
                            Models\AuditDetail::class => ['create'],
1080 3
                            Models\Session::class => ['*'],
1081 3
                        ],
1082 3
                    ],
1083
                    
1084 3
                    'login' => [
1085 3
                        'components' => [
1086 3
                            Api\Controllers\AuthController::class => ['login'],
1087 3
                            Models\User::class => ['find'],
1088 3
                        ],
1089 3
                    ],
1090
                    
1091 3
                    'logout' => [
1092 3
                        'components' => [
1093 3
                            Api\Controllers\AuthController::class => ['logout'],
1094 3
                        ],
1095 3
                    ],
1096
                    
1097 3
                    'register' => [
1098 3
                        'components' => [
1099 3
                            Api\Controllers\AuthController::class => ['register'],
1100 3
                            Models\User::class => ['find', 'create'],
1101 3
                        ],
1102 3
                    ],
1103
                    
1104 3
                    'cron' => [
1105 3
                        'components' => [
1106 3
                            Cli\Tasks\CronTask::class => ['*'],
1107 3
                        ],
1108 3
                    ],
1109
                    
1110 3
                    'manageRoleList' => [
1111 3
                        'components' => [
1112 3
                            Api\Controllers\RoleController::class => ['*'],
1113 3
                            Models\Role::class => ['*'],
1114 3
                            Models\UserRole::class => ['*'],
1115 3
                        ],
1116 3
                        'behaviors' => [
1117 3
                            Api\Controllers\RoleController::class => [
1118 3
                                Behavior\Skip\SkipIdentityCondition::class,
1119 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1120 3
                            ],
1121 3
                        ],
1122 3
                    ],
1123
                    
1124 3
                    'manageGroupList' => [
1125 3
                        'components' => [
1126 3
                            Api\Controllers\GroupController::class => ['*'],
1127 3
                            Models\Group::class => ['*'],
1128 3
                        ],
1129 3
                        'behaviors' => [
1130 3
                            Api\Controllers\GroupController::class => [
1131 3
                                Behavior\Skip\SkipIdentityCondition::class,
1132 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1133 3
                            ],
1134 3
                        ],
1135 3
                    ],
1136
                    
1137 3
                    'manageTypeList' => [
1138 3
                        'components' => [
1139 3
                            Api\Controllers\TypeController::class => ['*'],
1140 3
                            Models\Group::class => ['*'],
1141 3
                        ],
1142 3
                        'behaviors' => [
1143 3
                            Api\Controllers\TypeController::class => [
1144 3
                                Behavior\Skip\SkipIdentityCondition::class,
1145 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1146 3
                            ],
1147 3
                        ],
1148 3
                    ],
1149
                    
1150 3
                    'manageLangList' => [
1151 3
                        'components' => [
1152 3
                            Api\Controllers\LangController::class => ['*'],
1153 3
                            Models\Lang::class => ['*'],
1154 3
                        ],
1155 3
                        'behaviors' => [
1156 3
                            Api\Controllers\LangController::class => [
1157 3
                                Behavior\Skip\SkipIdentityCondition::class,
1158 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1159 3
                            ],
1160 3
                        ],
1161 3
                    ],
1162
                    
1163 3
                    'manageUserList' => [
1164 3
                        'components' => [
1165 3
                            Api\Controllers\UserController::class => ['*'],
1166 3
                            Models\User::class => ['*'],
1167 3
                        ],
1168 3
                        'behaviors' => [
1169 3
                            Api\Controllers\UserController::class => [
1170 3
                                Behavior\Skip\SkipIdentityCondition::class,
1171 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1172 3
                            ],
1173 3
                        ],
1174 3
                    ],
1175
                    
1176 3
                    'manageTemplateList' => [
1177 3
                        'components' => [
1178 3
                            Api\Controllers\TemplateController::class => ['*'],
1179 3
                            Models\Template::class => ['*'],
1180 3
                        ],
1181 3
                        'behaviors' => [
1182 3
                            Api\Controllers\TemplateController::class => [
1183 3
                                Behavior\Skip\SkipIdentityCondition::class,
1184 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1185 3
                            ],
1186 3
                        ],
1187 3
                    ],
1188
                    
1189 3
                    'manageAuditList' => [
1190 3
                        'components' => [
1191 3
                            Api\Controllers\AuditController::class => ['*'],
1192 3
                            Models\Audit::class => ['*'],
1193 3
                        ],
1194 3
                        'behaviors' => [
1195 3
                            Api\Controllers\AuditController::class => [
1196 3
                                Behavior\Skip\SkipIdentityCondition::class,
1197 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1198 3
                            ],
1199 3
                        ],
1200 3
                    ],
1201
                    
1202 3
                    'manageSiteList' => [
1203 3
                        'components' => [
1204 3
                            Api\Controllers\SiteController::class => ['*'],
1205 3
                            Models\Site::class => ['*'],
1206 3
                            Models\SiteLang::class => ['*'],
1207 3
                        ],
1208 3
                        'behaviors' => [
1209 3
                            Api\Controllers\SiteController::class => [
1210 3
                                Behavior\Skip\SkipIdentityCondition::class,
1211 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1212 3
                            ],
1213 3
                        ],
1214 3
                    ],
1215
                    
1216 3
                    'managePageList' => [
1217 3
                        'components' => [
1218 3
                            Api\Controllers\PageController::class => ['*'],
1219 3
                            Models\Page::class => ['*'],
1220 3
                        ],
1221 3
                        'behaviors' => [
1222 3
                            Api\Controllers\PageController::class => [
1223 3
                                Behavior\Skip\SkipIdentityCondition::class,
1224 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1225 3
                            ],
1226 3
                        ],
1227 3
                    ],
1228
                    
1229 3
                    'managePostList' => [
1230 3
                        'components' => [
1231 3
                            Api\Controllers\PostController::class => ['*'],
1232 3
                            Models\Post::class => ['*'],
1233 3
                        ],
1234 3
                        'behaviors' => [
1235 3
                            Api\Controllers\PostController::class => [
1236 3
                                Behavior\Skip\SkipIdentityCondition::class,
1237 3
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1238 3
                            ],
1239 3
                        ],
1240 3
                    ],
1241 3
                ],
1242
                
1243
                /**
1244
                 * Roles permissions
1245
                 */
1246 3
                'roles' => [
1247
                    
1248
                    // Console (CLI)
1249 3
                    'cli' => [
1250 3
                        'components' => [
1251 3
                            Cli\Tasks\BuildTask::class => ['*'],
1252 3
                            Cli\Tasks\CacheTask::class => ['*'],
1253 3
                            Cli\Tasks\CronTask::class => ['*'],
1254 3
                            Cli\Tasks\ErrorTask::class => ['*'],
1255 3
                            Cli\Tasks\DeploymentTask::class => ['*'],
1256 3
                            Cli\Tasks\HelpTask::class => ['*'],
1257 3
                            Cli\Tasks\ScaffoldTask::class => ['*'],
1258 3
                            Cli\Tasks\TestTask::class => ['*'],
1259 3
                        ],
1260 3
                    ],
1261
                    
1262
                    // Everyone with or without role
1263 3
                    'everyone' => [
1264 3
                        'features' => [
1265 3
                            'base',
1266 3
                        ],
1267 3
                    ],
1268
                    
1269
                    // Everyone without role
1270 3
                    'guest' => [
1271 3
                        'features' => [
1272 3
                            'login',
1273 3
                            'logout',
1274 3
                            'register',
1275 3
                        ],
1276 3
                    ],
1277
                    
1278
                    // User
1279 3
                    'user' => [
1280 3
                        'features' => [
1281 3
                            'logout',
1282 3
                        ],
1283 3
                    ],
1284
                    
1285
                    // Admin
1286 3
                    'admin' => [
1287 3
                        'features' => [
1288 3
                            'manageUserList',
1289 3
                            'manageLangList',
1290 3
                            'manageSiteList',
1291 3
                            'managePageList',
1292 3
                            'managePostList',
1293 3
                            'manageTemplateList',
1294 3
                        ],
1295 3
                        'inherit' => [
1296 3
                            'user',
1297 3
                        ],
1298 3
                        'behaviors' => [
1299 3
                        ],
1300 3
                    ],
1301
                    
1302
                    // Dev
1303 3
                    'dev' => [
1304 3
                        'features' => [
1305 3
                            'manageRoleList',
1306 3
                            'manageGroupList',
1307 3
                            'manageTypeList',
1308 3
                            'manageAuditList',
1309 3
                        ],
1310 3
                        'inherit' => [
1311 3
                            'user',
1312 3
                            'admin',
1313 3
                        ],
1314 3
                    ],
1315 3
                ],
1316 3
            ],
1317 3
        ], $insensitive);
1318 3
        if (!empty($data)) {
1319
            $this->merge(new PhalconConfig($data, $insensitive));
1320
        }
1321
    }
1322
    
1323
    /**
1324
     * Merge the specified environment config with this one
1325
     * This should be used to overwrite specific values only
1326
     *
1327
     * @param null|string $env If null, will fetch the current environement from $this->app->env
1328
     *
1329
     * @return Config $this Return the merged current config
1330
     */
1331
    public function mergeEnvConfig(?string $env = null): self
1332
    {
1333
        $configFile = $this->app->dir->config . (isset($env) ? $env : $this->app->env) . '.php';
1334
        if (file_exists($configFile)) {
1335
            $envConfig = require_once $configFile;
1336
            if (!empty($envConfig)) {
1337
                $envConfig = is_callable($envConfig) ? $envConfig() : $envConfig;
1338
                if (is_array($envConfig)) {
1339
                    $this->merge(new PhalconConfig($envConfig));
1340
                }
1341
            }
1342
        }
1343
        
1344
        return $this;
1345
    }
1346
}
1347
1348
//if (php_sapi_name() === 'cli') {
1349
//    $devtoolConfig = new Config();
1350
//    return $devtoolConfig->mergeEnvConfig();
1351
//}
1352