|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Created by Error202
 | 
					
						
							|  |  |  |  * Date: 04.09.2018
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace console\controllers;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use console\components\ConsoleColor;
 | 
					
						
							|  |  |  | use core\components\SearchPerformance;
 | 
					
						
							|  |  |  | use core\entities\ModuleRecord;
 | 
					
						
							|  |  |  | use core\helpers\FileHelper;
 | 
					
						
							|  |  |  | use core\services\ModuleService;
 | 
					
						
							|  |  |  | use core\services\PermissionManager;
 | 
					
						
							|  |  |  | use yii\console\Controller;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Modules management from console
 | 
					
						
							|  |  |  |  * Class ModuleController
 | 
					
						
							|  |  |  |  * @package console\controllers
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | class ModuleController extends Controller
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @var ModuleService Modules management service
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     private $_service;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @var PermissionManager Manage permissions
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     private $_permission_manager;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct(string $id, $module, ModuleService $service, PermissionManager $permission_manager, array $config = [])
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         parent::__construct($id, $module, $config);
 | 
					
						
							|  |  |  |         $this->_service = $service;
 | 
					
						
							|  |  |  |         $this->_permission_manager = $permission_manager;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * First modules initialization
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public function actionInit() : void
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         \Yii::$app->moduleManager->getModules();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Activate module and apply it migration if needed
 | 
					
						
							|  |  |  |      * @param $name
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public function actionActivate($name)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $module = ModuleRecord::find()->andWhere(['name' => $name])->one();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($module || $module->isDisabled()) {
 | 
					
						
							|  |  |  |             $this->_service->enable($module);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function actionSetSystem($name)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $module = ModuleRecord::find()->andWhere(['name' => $name])->one();
 | 
					
						
							|  |  |  |         if ($module) {
 | 
					
						
							|  |  |  |             $this->_service->setSystem($module);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function actionInstall($name)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $path = \Yii::getAlias('@common/modules/' . $name);
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Installing module: ', 'yellow') . ConsoleColor::log($name, 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // check exists
 | 
					
						
							|  |  |  |         if (file_exists($path)) {
 | 
					
						
							|  |  |  |             echo ConsoleColor::log('Module ' . $name . ' already exists', 'red') . PHP_EOL;
 | 
					
						
							|  |  |  |             return;
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // create folder
 | 
					
						
							|  |  |  |         mkdir($path);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // git clone
 | 
					
						
							|  |  |  |         chdir($path);
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Git clone: ', 'normal');
 | 
					
						
							|  |  |  |         shell_exec('git clone https://gitlab.com/zertex/zxcms-' . $name . '.git .');
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('complete', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // get module manifest
 | 
					
						
							|  |  |  |         $manifest = require \Yii::getAlias('@common/modules/' . $name . '/manifest.php');
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // migration
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Database: ', 'normal');
 | 
					
						
							|  |  |  |         if (file_exists($path . '/migrations')) {
 | 
					
						
							|  |  |  |             shell_exec('php ' . __DIR__ . '/../../yii migrate --migrationPath=' . $path . '/migrations --interactive=0');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('complete', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // add module record with active flag
 | 
					
						
							|  |  |  |         $db_module = ModuleRecord::find()->andWhere(['name' => $name])->one();
 | 
					
						
							|  |  |  |         if (!$db_module) {
 | 
					
						
							|  |  |  |             $this->_service->create($name, 'common\\modules\\' . $name . '\\' . $manifest['module'], 'common', 1);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // init permissions
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Permissions: ', 'normal');
 | 
					
						
							|  |  |  |         if (isset($manifest['permissions']) && is_array($manifest['permissions'])) {
 | 
					
						
							|  |  |  |             $this->assignPermissions($manifest['permissions']);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('complete', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // regenerate cp global search
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Search database: ', 'normal');
 | 
					
						
							|  |  |  |         SearchPerformance::init();
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('complete', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Module ' . $name . ' successfully installed', 'light_green') . PHP_EOL;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function actionRemove($name)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $path = \Yii::getAlias('@common/modules/' . $name);
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Removing module: ', 'yellow') . ConsoleColor::log($name, 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // get module manifest
 | 
					
						
							|  |  |  |         $manifest = require \Yii::getAlias('@common/modules/' . $name . '/manifest.php');
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // drop module record
 | 
					
						
							|  |  |  |         $db_module = ModuleRecord::find()->andWhere(['name' => $name])->one();
 | 
					
						
							|  |  |  |         if ($db_module) {
 | 
					
						
							|  |  |  |             $this->_service->delete($db_module);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // revert migration
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Database: ', 'normal');
 | 
					
						
							|  |  |  |         if (file_exists($path . '/migrations')) {
 | 
					
						
							|  |  |  |             shell_exec('php ' . __DIR__ . '/../../yii migrate/down 500 --migrationPath=' . $path . '/migrations --interactive=0');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('clean', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // check exists, remove if founded
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Module files: ', 'normal');
 | 
					
						
							|  |  |  |         if (file_exists($path)) {
 | 
					
						
							|  |  |  |             FileHelper::removeDirectory($path);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('clean', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // drop permissions
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Permissions: ', 'normal');
 | 
					
						
							|  |  |  |         if (isset($manifest['permissions']) && is_array($manifest['permissions'])) {
 | 
					
						
							|  |  |  |             $this->removePermissions($manifest['permissions']);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('clean', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // regenerate cp global search
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Search database: ', 'normal');
 | 
					
						
							|  |  |  |         SearchPerformance::init();
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('complete', 'white') . PHP_EOL;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         echo ConsoleColor::log('Module ' . $name . ' successfully deleted', 'light_green') . PHP_EOL;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private function assignPermissions(array $permissions): void
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         foreach ($permissions as $permission => $description) {
 | 
					
						
							|  |  |  |             if (!$this->_permission_manager->permissionExists($permission)) {
 | 
					
						
							|  |  |  |                 $this->_permission_manager->create($permission, $description);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private function removePermissions(array $permissions)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         foreach ($permissions as $permission => $description) {
 | 
					
						
							|  |  |  |             if ($this->_permission_manager->permissionExists($permission)) {
 | 
					
						
							|  |  |  |                 $this->_permission_manager->delete($permission);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |