From fc7fc8055cc39d3d884045aefbf22e466e10e0fc Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 25 Sep 2021 14:48:53 +0200 Subject: [PATCH] bug fixes --- Controller/ApiController.php | 88 +++++++++++++++++++++++++++++++++--- Models/App.php | 12 +++++ Models/Module.php | 25 ++++++++-- Models/ModuleMapper.php | 7 ++- 4 files changed, 120 insertions(+), 12 deletions(-) diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 5801a54..7cfabe8 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -66,6 +66,12 @@ use phpOMS\Utils\Parser\Markdown\Markdown; use phpOMS\Utils\StringUtils; use phpOMS\Validation\Network\Email as EmailValidator; use phpOMS\Version\Version; +use phpOMS\Application\ApplicationInfo; +use phpOMS\Module\ModuleInfo; +use Modules\Admin\Models\Module; +use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\Message\Http\HttpResponse; +use phpOMS\Module\ModuleStatus; /** * Admin controller class. @@ -490,11 +496,11 @@ final class ApiController extends Controller return; } - $info = new ApplicationInfo(__DIR__ . '/../../../' . $app); - $info->load(); + $appInfo = new ApplicationInfo(__DIR__ . '/../../../' . $app . '/info.json'); + $appInfo->load(); // handle dependencies - $dependencies = $info->getDependencies(); + $dependencies = $appInfo->getDependencies(); $installed = $this->app->moduleManager->getInstalledModules(); foreach ($dependencies as $key => $version) { @@ -512,7 +518,7 @@ final class ApiController extends Controller // handle providing if ($result) { - $providing = $info->getProviding(); + $providing = $appInfo->getProviding(); foreach ($providing as $key => $version) { if (isset($installed[$key])) { @@ -520,6 +526,17 @@ final class ApiController extends Controller } } } + + // handle Routes of already installed modules + // @todo: what about navigation links, works for Api and Backend but only since the Navigation module is installed afterwards. Other applications don't have this and would not have the links? + foreach ($installed as $module => $data) { + $class = '\Modules\\' . $module . '\Admin\Installer'; + + $moduleInfo = new ModuleInfo(__DIR__ . '/../../../Modules/' . $module . '/info.json'); + $moduleInfo->load(); + + $class::reInit($moduleInfo, $appInfo); + } } /** @@ -667,7 +684,7 @@ final class ApiController extends Controller */ public function apiGroupDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - if (((int) $request->getId('id')) === 3) { + if (((int) $request->getData('id')) === 3) { // admin group cannot be deleted $this->fillJsonResponse($request, $response, NotificationLevel::ERROR, 'Group', 'Admin group cannot be deleted', []); @@ -1063,9 +1080,66 @@ final class ApiController extends Controller break; case ModuleStatusUpdateType::INSTALL: - $done = $module === 'Admin' ? false : $this->app->moduleManager->install($module); + $done = $this->app->moduleManager->isInstalled($module) ? true : false; $msg = $done ? 'Module successfully installed.' : 'Module not installed.'; + if ($done) { + break; + } + + $moduleInfo = new ModuleInfo(__DIR__ . '/../../../Modules/' . $module . '/info.json'); + $moduleInfo->load(); + + // install dependencies + $dependencies = $moduleInfo->getDependencies(); + foreach ($dependencies as $key => $version) { + $iResponse = new HttpResponse(); + $iRequest = new HttpRequest(new HttpUri('')); + $iRequest->header->account = 1; + $iRequest->setData('status', ModuleStatusUpdateType::INSTALL); + + $iRequest->setData('module', $key, true); + $this->apiModuleStatusUpdate($iRequest, $iResponse); + } + + // install module + $moduleObj = new Module(); + $moduleObj->id = $module; + $moduleObj->theme = 'Default'; + $moduleObj->path = $moduleInfo->getDirectory(); + $moduleObj->version = $moduleInfo->getVersion(); + + $moduleObj->setStatus(ModuleStatus::AVAILABLE); + + ModuleMapper::create($moduleObj); + + $done = $this->app->moduleManager->install($module); + $msg = $done ? 'Module successfully installed.' : 'Module not installed.'; + + $moduleObj->setStatus(ModuleStatus::ACTIVE); + ModuleMapper::update($moduleObj); + + $queryLoad = new Builder($this->app->dbPool->get('insert')); + $queryLoad->insert('module_load_pid', 'module_load_type', 'module_load_from', 'module_load_for', 'module_load_file') + ->into('module_load'); + + $load = $moduleInfo->getLoad(); + foreach ($load as $val) { + foreach ($val['pid'] as $pid) { + $queryLoad->values( + \sha1(\str_replace('/', '', $pid)), + (int) $val['type'], + $val['from'], + $val['for'], + $val['file'] + ); + } + } + + if (!empty($queryLoad->getValues())) { + $queryLoad->execute(); + } + break; case ModuleStatusUpdateType::UNINSTALL: $done = $module === 'Admin' ? false : $this->app->moduleManager->uninstall($module); @@ -1208,7 +1282,7 @@ final class ApiController extends Controller */ public function apiAddGroupPermission(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - if (((int) $request->getId('permissionref')) === 3) { + if (((int) $request->getData('permissionref')) === 3) { // admin group cannot be deleted $this->fillJsonResponse($request, $response, NotificationLevel::ERROR, 'Group', 'Admin group permissions cannot get modified', []); diff --git a/Models/App.php b/Models/App.php index a256524..ff63d7e 100644 --- a/Models/App.php +++ b/Models/App.php @@ -57,4 +57,16 @@ class App * @since 1.0.0 */ public int $status = ApplicationStatus::NORMAL; + + /** + * Get id + * + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } } \ No newline at end of file diff --git a/Models/Module.php b/Models/Module.php index 2a4689b..ac3ef89 100755 --- a/Models/Module.php +++ b/Models/Module.php @@ -33,7 +33,7 @@ class Module * @var string * @since 1.0.0 */ - protected string $id = ''; + public string $id = ''; /** * Module name. @@ -44,12 +44,28 @@ class Module public string $name = ''; /** - * Module description. + * Module path. * * @var string * @since 1.0.0 */ - public string $description = ''; + public string $path = ''; + + /** + * Module version. + * + * @var string + * @since 1.0.0 + */ + public string $version = ''; + + /** + * Module theme. + * + * @var string + * @since 1.0.0 + */ + public string $theme = ''; /** * Group status. @@ -147,8 +163,9 @@ class Module return [ 'id' => $this->id, 'name' => $this->name, + 'path' => $this->path, + 'version' => $this->version, 'status' => $this->status, - 'description' => $this->description, 'createdAt' => $this->createdAt, ]; } diff --git a/Models/ModuleMapper.php b/Models/ModuleMapper.php index 7ed6fac..6902026 100755 --- a/Models/ModuleMapper.php +++ b/Models/ModuleMapper.php @@ -34,7 +34,10 @@ final class ModuleMapper extends DataMapperAbstract */ protected static array $columns = [ 'module_id' => ['name' => 'module_id', 'type' => 'string', 'internal' => 'id'], - 'module_active' => ['name' => 'module_active', 'type' => 'int', 'internal' => 'status'], + 'module_path' => ['name' => 'module_path', 'type' => 'string', 'internal' => 'path'], + 'module_theme' => ['name' => 'module_theme', 'type' => 'string', 'internal' => 'theme'], + 'module_version' => ['name' => 'module_version', 'type' => 'string', 'internal' => 'version'], + 'module_status' => ['name' => 'module_status', 'type' => 'int', 'internal' => 'status'], ]; /** @@ -52,4 +55,6 @@ final class ModuleMapper extends DataMapperAbstract * @since 1.0.0 */ protected static string $primaryField = 'module_id'; + + protected static bool $autoincrement = false; }