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.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							147 lines
						
					
					
						
							4.2 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace core\services; | 
						|
 | 
						|
use core\entities\ModuleRecord; | 
						|
use core\repositories\ModuleRepository; | 
						|
use yii\helpers\FileHelper; | 
						|
use Yii; | 
						|
 | 
						|
class ModuleService | 
						|
{ | 
						|
    private $modules; | 
						|
    private $permission_manager; | 
						|
 | 
						|
    public function __construct(ModuleRepository $modules, PermissionManager $permission_manager) | 
						|
    { | 
						|
        $this->modules = $modules; | 
						|
        $this->permission_manager = $permission_manager; | 
						|
    } | 
						|
 | 
						|
    public function create($name, $class, $type = 'common', $active = ModuleRecord::STATUS_DISABLED): ModuleRecord | 
						|
    { | 
						|
    	$module = new ModuleRecord(); | 
						|
    	$module->name = $name; | 
						|
    	$module->class = $class; | 
						|
    	$module->type = $type; | 
						|
    	$module->active = $active; | 
						|
    	$this->modules->save($module); | 
						|
    	return $module; | 
						|
    } | 
						|
 | 
						|
    public function delete(ModuleRecord $module) | 
						|
    { | 
						|
	    // connect manifest | 
						|
	    $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); | 
						|
 | 
						|
    	// down migrations | 
						|
	    $migrations = $this->getMigrationFiles($module->name); | 
						|
	    $migrations = array_reverse($migrations); | 
						|
	    foreach ($migrations as $migrationPath) { | 
						|
		    $migrationFile = basename($migrationPath); | 
						|
		    $migration = str_replace('.php', '', $migrationFile); | 
						|
		    if ($this->migrationExists($migration)) { | 
						|
			    require $migrationPath; | 
						|
			    $obj = new $migration; | 
						|
			    if (method_exists($obj, 'safeDown')) { | 
						|
				    $obj->safeDown(); | 
						|
				    Yii::$app->moduleManager->removeFromMigrationTable($migration); | 
						|
 | 
						|
			    } | 
						|
			    elseif (method_exists($obj, 'down')) { | 
						|
				    $obj->down(); | 
						|
				    Yii::$app->moduleManager->removeFromMigrationTable($migration); | 
						|
			    } | 
						|
		    } | 
						|
	    } | 
						|
 | 
						|
	    // remove permissions | 
						|
	    if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { | 
						|
		    $this->removePermissions($manifest['permissions']); | 
						|
	    } | 
						|
 | 
						|
	    // delete files | 
						|
	    $modulePath = Yii::getAlias('@common/modules/' . $module->name); | 
						|
	    if (file_exists($modulePath)) { | 
						|
	    	FileHelper::removeDirectory($modulePath); | 
						|
	    } | 
						|
	    // delete module record | 
						|
	    $this->modules->remove($module); | 
						|
    } | 
						|
 | 
						|
    public function disable(ModuleRecord $module) | 
						|
    { | 
						|
    	$module->active = ModuleRecord::STATUS_DISABLED; | 
						|
    	$this->modules->save($module); | 
						|
    } | 
						|
 | 
						|
	public function enable(ModuleRecord $module) | 
						|
	{ | 
						|
		// connect manifest | 
						|
		$manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); | 
						|
 | 
						|
		$module->active = ModuleRecord::STATUS_ENABLED; | 
						|
 | 
						|
		// migration if not exists | 
						|
		$migrations = $this->getMigrationFiles($module->name); | 
						|
		foreach ($migrations as $migrationPath) { | 
						|
			$migrationFile = basename($migrationPath); | 
						|
			$migration = str_replace('.php', '', $migrationFile); | 
						|
			if (!$this->migrationExists($migration)) { | 
						|
				// run migration | 
						|
				require $migrationPath; | 
						|
				$obj = new $migration; | 
						|
				if (method_exists($obj, 'safeUp')) { | 
						|
					$obj->safeUp(); | 
						|
					Yii::$app->moduleManager->appendToMigrationTable($migration); | 
						|
 | 
						|
				} | 
						|
				elseif (method_exists($obj, 'up')) { | 
						|
					$obj->up(); | 
						|
					Yii::$app->moduleManager->appendToMigrationTable($migration); | 
						|
				} | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		// add not exists permissions | 
						|
		if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { | 
						|
			$this->assignPermissions($manifest['permissions']); | 
						|
		} | 
						|
 | 
						|
		$this->modules->save($module); | 
						|
	} | 
						|
 | 
						|
	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); | 
						|
			} | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	private function getMigrationFiles($module) | 
						|
	{ | 
						|
		// migration if not exists | 
						|
		$migrationPath = Yii::getAlias('@common/modules/' . $module . '/migrations'); | 
						|
		return file_exists($migrationPath) ? FileHelper::findFiles($migrationPath) : []; | 
						|
	} | 
						|
 | 
						|
	private function migrationExists($name): bool | 
						|
	{ | 
						|
		// check record exists | 
						|
		$connection = Yii::$app->getDb(); | 
						|
		$command = $connection->createCommand("SELECT * FROM migration WHERE version = '$name'"); | 
						|
		$result = $command->queryAll(); | 
						|
		return $result ? true : false; | 
						|
	} | 
						|
} |