From d2028e926b31b3756ea293058f44242e6c253a21 Mon Sep 17 00:00:00 2001 From: stasbilay02 Date: Thu, 14 Nov 2024 01:55:04 +0300 Subject: [PATCH] update modules from ms --- kernel/app_modules/tag/views/index.php | 4 -- kernel/helpers/RESTClient.php | 21 ++++++ .../ModuleShopClientController.php | 68 +++++++------------ .../routs/module_shop_client.php | 1 + .../module_shop_client/views/index.php | 14 ++++ kernel/services/ModuleService.php | 45 +++++++++--- 6 files changed, 95 insertions(+), 58 deletions(-) create mode 100644 kernel/helpers/RESTClient.php diff --git a/kernel/app_modules/tag/views/index.php b/kernel/app_modules/tag/views/index.php index 0d5503f..ceacd8f 100644 --- a/kernel/app_modules/tag/views/index.php +++ b/kernel/app_modules/tag/views/index.php @@ -8,10 +8,6 @@ use Itguild\EloquentTable\EloquentDataProvider; use Itguild\EloquentTable\ListEloquentTable; use kernel\app_modules\tag\models\Tag; use kernel\IGTabel\btn\PrimaryBtn; -use kernel\models\Menu; -use kernel\modules\menu\table\columns\MenuDeleteActionColumn; -use kernel\modules\menu\table\columns\MenuEditActionColumn; -use kernel\modules\menu\table\columns\MenuViewActionColumn; $table = new ListEloquentTable(new EloquentDataProvider(Tag::class, [ 'currentPage' => $page_number, diff --git a/kernel/helpers/RESTClient.php b/kernel/helpers/RESTClient.php new file mode 100644 index 0000000..2706b01 --- /dev/null +++ b/kernel/helpers/RESTClient.php @@ -0,0 +1,21 @@ +request($method, $url, [ + 'headers' => [ + 'Authorization' => 'Bearer ' . $_ENV['MODULE_SHOP_TOKEN'] + ] + ]); + } + +} \ No newline at end of file diff --git a/kernel/modules/module_shop_client/controllers/ModuleShopClientController.php b/kernel/modules/module_shop_client/controllers/ModuleShopClientController.php index 6d9e0ef..38015d7 100644 --- a/kernel/modules/module_shop_client/controllers/ModuleShopClientController.php +++ b/kernel/modules/module_shop_client/controllers/ModuleShopClientController.php @@ -6,8 +6,10 @@ use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use JetBrains\PhpStorm\NoReturn; use kernel\AdminController; +use kernel\Flash; use kernel\helpers\Debug; use kernel\helpers\Files; +use kernel\helpers\RESTClient; use kernel\modules\module_shop_client\services\ModuleShopClientService; use kernel\Request; use kernel\services\ModuleService; @@ -33,13 +35,7 @@ class ModuleShopClientController extends AdminController public function actionIndex(int $page_number = 1): void { $per_page = 8; - - $token = $_ENV['MODULE_SHOP_TOKEN']; - $modules_info = $this->client->request('GET', $_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug', [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token, - ] - ]); + $modules_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug'); $modules_info = json_decode($modules_info->getBody()->getContents(), true); $module_count = count($modules_info); $modules_info = array_slice($modules_info, $per_page*($page_number-1), $per_page); @@ -52,17 +48,9 @@ class ModuleShopClientController extends AdminController ]); } - /** - * @throws GuzzleException - */ public function actionView(int $id): void { - $token = $_ENV['MODULE_SHOP_TOKEN']; - $module_info = $this->client->request('GET', $_ENV['MODULE_SHOP_URL'] . '/api/module_shop/' . $id, [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token, - ] - ]); + $module_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/' . $id); $module_info = json_decode($module_info->getBody()->getContents(), true); $this->cgView->render("view.php", ['data' => $module_info]); } @@ -72,39 +60,31 @@ class ModuleShopClientController extends AdminController */ #[NoReturn] public function actionInstall(): void { -// $request = new Request(); -// $id = $request->get('id'); -// $token = $_ENV['MODULE_SHOP_TOKEN']; -// Debug::prn(123); -// $module = $this->client->request('GET', $_ENV['MODULE_SHOP_URL'] . '/api/module_shop/install/' . $id, [ -// 'headers' => [ -// 'Authorization' => 'Bearer ' . $token, -// 'Accept' => 'application/itguild', -// 'sink' => RESOURCES_DIR . '/tmp/ms/some.itguild' -// ] -// ]); -// -// $module = json_decode($module->getBody()->getContents(), true); -//// Debug::dd(123); -// $this->moduleService->installModule(RESOURCES_DIR . '/tmp/ms/some.igm'); -// $this->redirect('/admin/module_shop_client', 302); - - $request = new Request(); $id = $request->get("id"); - $token = $_ENV['MODULE_SHOP_TOKEN']; - $module_info = $this->client->request('GET', $_ENV['MODULE_SHOP_URL'] . '/api/module_shop/' . $id, [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token, - ] - ]); + $module_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/install/' . $id); + $module_info = json_decode($module_info->getBody()->getContents(), true); Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $module_info['path_to_archive'], RESOURCES_DIR . "/tmp/modules"); $this->moduleService->installModule('/resources/tmp/modules/' . basename($module_info['path_to_archive'])); -// Debug::prn($this->moduleService->getErrors()); -// Debug::dd(RESOURCES_DIR . '/tmp/modules/' . basename($module_info['path_to_archive'])); - $this->moduleService->installModule(RESOURCES_DIR . '/tmp/ms/some.igm'); + + Flash::setMessage("success", "Модуль успешно установлен."); $this->redirect('/admin/module_shop_client', 302); + } + + #[NoReturn] public function actionUpdate(): void + { + $request = new Request(); + $id = $request->get("id"); + $module_info = RESTClient::request($_ENV['MODULE_SHOP_URL'] . '/api/module_shop/' . $id); + + $module_info = json_decode($module_info->getBody()->getContents(), true); + Files::uploadByUrl($_ENV['MODULE_SHOP_URL'] . $module_info['path_to_archive'], RESOURCES_DIR . "/tmp/modules"); + $this->moduleService->updateModule('/resources/tmp/modules/' . basename($module_info['path_to_archive'])); + + Flash::setMessage("success", "Модуль успешно обновлен."); + $this->redirect('/admin/module_shop_client', 302); + } @@ -114,6 +94,8 @@ class ModuleShopClientController extends AdminController $slug = $request->get("slug"); $module_info = $this->moduleService->getModuleInfoBySlug($slug); $this->moduleService->uninstallModule($module_info['app_module_path']); + + Flash::setMessage("success", "Модуль успешно удален."); $this->redirect('/admin/module_shop_client', 302); } diff --git a/kernel/modules/module_shop_client/routs/module_shop_client.php b/kernel/modules/module_shop_client/routs/module_shop_client.php index fa2ef40..416831c 100644 --- a/kernel/modules/module_shop_client/routs/module_shop_client.php +++ b/kernel/modules/module_shop_client/routs/module_shop_client.php @@ -14,6 +14,7 @@ App::$collector->group(["prefix" => "admin"], function (RouteCollector $router){ App::$collector->get('/install', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionInstall']); App::$collector->get('/view/{id}', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionView']); App::$collector->get('/delete', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionDelete']); + App::$collector->get('/update', [\kernel\modules\module_shop_client\controllers\ModuleShopClientController::class, 'actionUpdate']); }); }); }); \ No newline at end of file diff --git a/kernel/modules/module_shop_client/views/index.php b/kernel/modules/module_shop_client/views/index.php index 55a43a8..5e44e0a 100644 --- a/kernel/modules/module_shop_client/views/index.php +++ b/kernel/modules/module_shop_client/views/index.php @@ -48,6 +48,20 @@ $table->addAction(function ($row, $url) use ($moduleService){ return $btn; }); +$table->addAction(function ($row, $url) use ($moduleService){ + $slug = $row['slug']; + $id = $row['id']; + if ($moduleService->isInstall($slug)){ + if (!$moduleService->isLastVersion($slug)) { + $label = "Обновить"; + $btn_type = "danger"; + return "$label"; + } + } + return false; + +}); + $table->create(); diff --git a/kernel/services/ModuleService.php b/kernel/services/ModuleService.php index d886a05..f8aad07 100644 --- a/kernel/services/ModuleService.php +++ b/kernel/services/ModuleService.php @@ -3,6 +3,7 @@ namespace kernel\services; use DirectoryIterator; +use GuzzleHttp\Client; use kernel\helpers\Debug; use kernel\helpers\Files; use kernel\helpers\Manifest; @@ -281,7 +282,7 @@ class ModuleService $tmpModuleDir = md5(time()); $res = $zip->open(ROOT_DIR . $path); if ($res === TRUE) { - $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $tmpModuleDir . "/"; + $tmpModuleDirFull = RESOURCES_DIR . '/tmp/modules/' . $tmpModuleDir . "/"; $zip->extractTo($tmpModuleDirFull); $zip->close(); } else { @@ -289,20 +290,20 @@ class ModuleService return false; } - if (!file_exists($tmpModuleDirFull . "/app/manifest.json")) { + if (!file_exists($tmpModuleDirFull . "app/manifest.json")) { $this->addError('manifest.json not found'); return false; } - $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "/app/manifest.json")); + $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "app/manifest.json")); $manifest = Manifest::getWithVars($manifestJson); $fileHelper = new Files(); - $fileHelper->copy_folder($tmpModuleDirFull . '/app', $manifest['app_module_path']); + $fileHelper->copy_folder($tmpModuleDirFull . 'app', $manifest['app_module_path']); if (isset($manifest['kernel_module_path'])) { - $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', $manifest['kernel_module_path']); + $fileHelper->copy_folder($tmpModuleDirFull . 'kernel', $manifest['kernel_module_path']); } else { - $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', KERNEL_APP_MODULES_DIR . '/' . $manifest['slug']); + $fileHelper->copy_folder($tmpModuleDirFull . 'kernel', KERNEL_APP_MODULES_DIR . '/' . $manifest['slug']); } $fileHelper->recursiveRemoveDir($tmpModuleDirFull); @@ -368,7 +369,7 @@ class ModuleService $tmpModuleDir = md5(time()); $res = $zip->open(ROOT_DIR . $path); if ($res === TRUE) { - $tmpModuleDirFull = RESOURCES_DIR . '/tmp/ad/' . $tmpModuleDir . "/"; + $tmpModuleDirFull = RESOURCES_DIR . '/tmp/modules/' . $tmpModuleDir . "/"; $zip->extractTo($tmpModuleDirFull); $zip->close(); } else { @@ -376,19 +377,21 @@ class ModuleService return false; } - if (!file_exists($tmpModuleDirFull . "/app/manifest.json")) { + if (!file_exists($tmpModuleDirFull . "app/manifest.json")) { $this->addError('manifest.json not found'); return false; } - $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "/app/manifest.json")); + $manifestJson = getConst(file_get_contents($tmpModuleDirFull . "app/manifest.json")); $manifest = Manifest::getWithVars($manifestJson); $fileHelper = new Files(); + + $fileHelper->copy_folder($tmpModuleDirFull . 'app/manifest.json', $manifest['app_module_path'] . '/manifest.json'); if (isset($manifest['kernel_module_path'])) { - $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', $manifest['kernel_module_path']); + $fileHelper->copy_folder($tmpModuleDirFull . 'kernel', $manifest['kernel_module_path']); } else { - $fileHelper->copy_folder($tmpModuleDirFull . '/kernel', KERNEL_APP_MODULES_DIR . '/' . $manifest['slug']); + $fileHelper->copy_folder($tmpModuleDirFull . 'kernel', KERNEL_APP_MODULES_DIR . '/' . $manifest['slug']); } $fileHelper->recursiveRemoveDir($tmpModuleDirFull); @@ -433,4 +436,24 @@ class ModuleService return false; } + public function isLastVersion(string $slug): bool + { + $client = new Client(); + $token = $_ENV['MODULE_SHOP_TOKEN']; + $modules_info = $client->request('GET', $_ENV['MODULE_SHOP_URL'] . '/api/module_shop/gb_slug', [ + 'headers' => [ + 'Authorization' => 'Bearer ' . $token, + ] + ]); + $modules_info = json_decode($modules_info->getBody()->getContents(), true); + $mod_info = $this->getModuleInfoBySlug($slug); + foreach ($modules_info as $mod) { + if ($mod['slug'] === $mod_info['slug'] && $mod['version'] === $mod_info['version']) { + return true; + } + } + return false; + + } + } \ No newline at end of file