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.
173 lines
5.7 KiB
173 lines
5.7 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 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); |
|
} |
|
} |
|
} |
|
}
|
|
|