Passed
Push — develop ( a04425...8843c6 )
by Nikolay
05:16 queued 14s
created

ReloadModuleStateAction   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 110
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 21
eloc 40
c 1
b 0
f 0
dl 0
loc 110
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
C handleModuleConfigChanges() 0 36 13
A execute() 0 7 3
A planTheActionForFutureCycle() 0 13 3
A executeReloder() 0 14 2
1
<?php
2
3
namespace MikoPBX\Core\Workers\Libs\WorkerModelsEvents\Actions;
4
5
use MikoPBX\Common\Models\PbxExtensionModules;
6
use MikoPBX\Common\Providers\ModulesDBConnectionsProvider;
7
use MikoPBX\Common\Providers\PBXConfModulesProvider;
8
use MikoPBX\Core\Asterisk\Configs\AsteriskConfigInterface;
9
use MikoPBX\Core\Workers\WorkerModelsEvents;
10
use MikoPBX\Modules\Config\ConfigClass;
11
use MikoPBX\Modules\Config\SystemConfigInterface;
12
13
/**
14
 * Handles actions to reload module state when PBX extensions or module settings change.
15
 */
16
class ReloadModuleStateAction implements ReloadActionInterface
17
{
18
    const MODULE_SETTINGS_KEY = 'MODULE_SETTINGS_DATA';
19
20
    /**
21
     * Executes the action to reload module state based on provided parameters.
22
     *
23
     * @param array $parameters An array of parameters that may include module settings.
24
     * @return void
25
     */
26
    public function execute(array $parameters = []): void
27
    {
28
        foreach ($parameters as $record) {
29
            if (!array_key_exists(self::MODULE_SETTINGS_KEY, $record)) {
30
                $this->planTheActionForFutureCycle($record);
31
            } else {
32
                $this->executeReloder($record[self::MODULE_SETTINGS_KEY]);
33
            }
34
        }
35
36
    }
37
38
    /**
39
     * Performs the actual reloading of the module based on its configuration.
40
     *
41
     * @param array $moduleRecord Module configuration data.
42
     * @return void
43
     */
44
    private function executeReloder(array $moduleRecord): void
45
    {
46
        // Recreate modules array
47
        PBXConfModulesProvider::recreateModulesProvider();
48
49
        // Recreate database connections
50
        ModulesDBConnectionsProvider::recreateModulesDBConnections();
51
52
        // Hook module methods if they change system configs
53
        $className = str_replace('Module', '', $moduleRecord['uniqid']);
54
        $configClassName = "Modules\\{$moduleRecord['uniqid']}\\Lib\\{$className}Conf";
55
        if (class_exists($configClassName)) {
56
            $configClassObj = new $configClassName();
57
            $this->handleModuleConfigChanges($configClassObj, $moduleRecord);
58
        }
59
    }
60
61
    /**
62
     * Plans the action for a future cycle if the module settings are not immediately available.
63
     *
64
     * @param array $moduleRecord Partial module configuration data.
65
     * @return void
66
     */
67
    private function planTheActionForFutureCycle(array $moduleRecord): void
68
    {
69
        // Check if the module ID was presented
70
        if (empty($moduleRecord['recordId'])) {
71
            return;
72
        }
73
74
        // Find the module settings record
75
        $moduleSettings = PbxExtensionModules::findFirstById($moduleRecord['recordId']);
76
        if ($moduleSettings !== null) {
77
            // Invoke the action for the PBX module state with the module settings data
78
            $moduleRecord[self::MODULE_SETTINGS_KEY] = $moduleSettings->toArray();
79
            WorkerModelsEvents::invokeAction(ReloadModuleStateAction::class, $moduleRecord, 50);
80
        }
81
    }
82
83
    /**
84
     * Handles module configuration changes and applies necessary system configuration reloads.
85
     *
86
     * @param ConfigClass $configClassObj The module configuration class object.
87
     * @param array $moduleRecord Module configuration data.
88
     * @return void
89
     */
90
    public function handleModuleConfigChanges(ConfigClass $configClassObj, array $moduleRecord):void
91
    {
92
        // Reconfigure fail2ban and restart iptables
93
        if (method_exists($configClassObj, SystemConfigInterface::GENERATE_FAIL2BAN_JAILS)
94
            && !empty(call_user_func([$configClassObj, SystemConfigInterface::GENERATE_FAIL2BAN_JAILS]))) {
95
            WorkerModelsEvents::invokeAction(ReloadFail2BanConfAction::class, [], 50);
96
        }
97
98
        // Refresh Nginx conf if the module has any locations
99
        if (method_exists($configClassObj, SystemConfigInterface::CREATE_NGINX_LOCATIONS)
100
            && !empty(call_user_func([$configClassObj, SystemConfigInterface::CREATE_NGINX_LOCATIONS]))) {
101
            WorkerModelsEvents::invokeAction(ReloadNginxConfAction::class, [], 50);
102
        }
103
104
        // Refresh crontab rules if module has any for it
105
        if (method_exists($configClassObj, SystemConfigInterface::CREATE_CRON_TASKS)) {
106
            $tasks = [];
107
            call_user_func_array([$configClassObj, SystemConfigInterface::CREATE_CRON_TASKS], [&$tasks]);
108
            if (!empty($tasks)) {
109
                WorkerModelsEvents::invokeAction(ReloadCrondAction::class, [], 50);
110
            }
111
        }
112
113
        // Reconfigure asterisk manager interface
114
        if (method_exists($configClassObj, AsteriskConfigInterface::GENERATE_MANAGER_CONF)
115
            && !empty(call_user_func([$configClassObj, AsteriskConfigInterface::GENERATE_MANAGER_CONF]))) {
116
            WorkerModelsEvents::invokeAction(ReloadManagerAction::class, [], 50);
117
        }
118
119
        // Hook modules AFTER_ methods
120
        if ($moduleRecord['disabled'] === '1'
121
            && method_exists($configClassObj, SystemConfigInterface::ON_AFTER_MODULE_DISABLE)) {
122
            call_user_func([$configClassObj, SystemConfigInterface::ON_AFTER_MODULE_DISABLE]);
123
        } elseif ($moduleRecord['disabled'] === '0'
124
            && method_exists($configClassObj, SystemConfigInterface::ON_AFTER_MODULE_ENABLE)) {
125
            call_user_func([$configClassObj, SystemConfigInterface::ON_AFTER_MODULE_ENABLE]);
126
        }
127
    }
128
}