You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							187 lines
						
					
					
						
							6.1 KiB
						
					
					
				
			
		
		
	
	
							187 lines
						
					
					
						
							6.1 KiB
						
					
					
				| <?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) | |
|     { | |
|         // drop module record | |
|         $db_module = ModuleRecord::find()->andWhere(['name' => $name])->one(); | |
|  | |
|         if ($db_module == ModuleRecord::SYSTEM_YES) { | |
|             echo ConsoleColor::log('Module ' . $name . ' is system. Cannot be deleted.', 'red') . PHP_EOL; | |
|             return; | |
|         } | |
|  | |
|         if ($db_module) { | |
|             $this->_service->delete($db_module); | |
|         } | |
|  | |
|         $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'); | |
|  | |
|         // 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); | |
|             } | |
|         } | |
|     } | |
| }
 | |
| 
 |