From 1140c31ae24965304bae67833e2f0c68e9342a0f Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Wed, 19 Feb 2025 03:15:13 +1100 Subject: [PATCH 01/20] fix issue #616 --- .../Devtools/Modules/DevtoolsModules.php | 25 +++++++++++++------ .../Default/html/devtools/modules/module.html | 2 +- .../html/devtools/modules/module/info.html | 8 +++--- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 808506111..0c4346204 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -355,10 +355,10 @@ public function updateModule($data) $this->core->update($core); } - if ((isset($data['reinstall_table']) && $data['reinstall_table'] == true) || + if ((isset($data['run_install_uninstall']) && $data['run_install_uninstall'] == true) || (isset($data['truncate_table']) && $data['truncate_table'] == true) ) { - $this->reinstallTruncateTable($data); + $this->runInstallUninstallTruncateTable($data); } $this->addResponse('Module updated'); @@ -399,7 +399,7 @@ public function removeModule($data) } } - protected function reinstallTruncateTable($data) + protected function runInstallUninstallTruncateTable($data) { $moduleToReinstall = $this->modules->manager->getModuleInfo( [ @@ -431,7 +431,7 @@ protected function reinstallTruncateTable($data) $coreInstall = new CoreInstall; if ($data['type'] === 'core') { - if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { + if (isset($data['run_install_uninstall']) && $data['run_install_uninstall'] == true) { $coreInstall->init()->install(); } } else if ($data['type'] === 'packages') { @@ -439,16 +439,25 @@ protected function reinstallTruncateTable($data) if (isset($data['truncate_table']) && $data['truncate_table'] == true) { $coreInstall->init([$moduleModel->getSource()])->truncate(); - } else if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { - $coreInstall->init([$moduleModel->getSource()])->install(); + } else if (isset($data['run_install_uninstall']) && $data['run_install_uninstall'] == true) { + if ($data['installed'] == true) { + $coreInstall->init([$moduleModel->getSource()])->install(); + } else { + $coreInstall->init([$moduleModel->getSource()])->uninstall(); + } } } } else { $module = new $class(); + if (isset($data['truncate_table']) && $data['truncate_table'] == true && method_exists($module, 'truncate')) { $module->init()->truncate(); - } else if (isset($data['reinstall_table']) && $data['reinstall_table'] == true) { - $module->init()->install(); + } else if (isset($data['run_install_uninstall']) && $data['run_install_uninstall'] == true) { + if ($data['installed'] == true) { + $module->init()->install(); + } else { + $module->init()->uninstall(); + } } } } diff --git a/apps/Core/Views/Default/html/devtools/modules/module.html b/apps/Core/Views/Default/html/devtools/modules/module.html index ce0195edd..0379314e7 100644 --- a/apps/Core/Views/Default/html/devtools/modules/module.html +++ b/apps/Core/Views/Default/html/devtools/modules/module.html @@ -1692,7 +1692,7 @@ '{{componentId}}-{{sectionId}}-createrepo' : { }, '{{componentId}}-{{sectionId}}-installed' : { }, '{{componentId}}-{{sectionId}}-truncate_table' : { }, - '{{componentId}}-{{sectionId}}-reinstall_table' : { }, + '{{componentId}}-{{sectionId}}-run_install_uninstall' : { }, '{{componentId}}-{{sectionId}}-class' : { afterInit: function() { $('#{{componentId}}-{{sectionId}}-generate-module-class').click(function(e) { diff --git a/apps/Core/Views/Default/html/devtools/modules/module/info.html b/apps/Core/Views/Default/html/devtools/modules/module/info.html index 8227ec87b..53b36e522 100644 --- a/apps/Core/Views/Default/html/devtools/modules/module/info.html +++ b/apps/Core/Views/Default/html/devtools/modules/module/info.html @@ -463,7 +463,7 @@ )}} {% endif %} - {% if type === 'packages' or type === 'core' %} + {% if type != 'views' %}
{{adminltetags.useTag('fields', [ @@ -471,11 +471,11 @@ 'componentName' : componentName, 'componentId' : componentId, 'sectionId' : sectionId, - 'fieldId' : 'reinstall_table', - 'fieldLabel' : 'Reinstall Table?', + 'fieldId' : 'run_install_uninstall', + 'fieldLabel' : 'Run Install/Uninstall script?', 'fieldHelp' : true, 'fieldDisabled' : false, - 'fieldHelpTooltipContent' : 'This will reinstall the table structure.', + 'fieldHelpTooltipContent' : 'If installed is checked, install method of the Install.php script will be executed. If installed is unchecked, uninstall method of the Install.php script will be executed.', 'fieldType' : 'checkbox', 'fieldCheckboxType' : 'danger', 'fieldCheckboxChecked' : false, From 7701aeb36c26ce99b966f4608641a42a2e9b62b7 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Wed, 19 Feb 2025 04:32:25 +1100 Subject: [PATCH 02/20] fix issue #617. Also fixed issue with installer for view root folder not being deleted. --- .../Devtools/Modules/DevtoolsModules.php | 238 ++++++++++++++++-- .../Default/html/devtools/modules/select.html | 36 ++- .../ModulesServiceProvider/Installer.php | 8 + 3 files changed, 261 insertions(+), 21 deletions(-) diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 0c4346204..781f34446 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -6,6 +6,8 @@ use League\Flysystem\FilesystemException; use League\Flysystem\UnableToCheckExistence; use League\Flysystem\UnableToCreateDirectory; +use League\Flysystem\UnableToDeleteDirectory; +use League\Flysystem\UnableToDeleteFile; use League\Flysystem\UnableToReadFile; use League\Flysystem\UnableToRetrieveMetadata; use League\Flysystem\UnableToWriteFile; @@ -70,6 +72,7 @@ public function addModule($data) $data['repo'] = trim(str_replace('(clone)', '', $data['repo'])); $data['installed'] = '1'; $data['updated_by'] = '0'; + $data['version'] = '0.0.0'; if ($data['module_type'] === 'bundles') { if ($this->modules->{$data['module_type']}->add($data)) { @@ -129,18 +132,22 @@ public function addModule($data) if ($data['module_type'] === 'views' && $data['base_view_module_id'] == 0) { $data['view_modules_version'] = '0.0.0'; } + $viewPublic = true; + if ($data['module_type'] === 'views' && $data['is_subview'] == true) { + $viewPublic = false; + } if ($data['apps'] === '') { $data['apps'] = $this->helper->encode([]); } try { - if ($this->modules->{$data['module_type']}->add($data) && - $this->updateModuleJson($data, false, true) && - $this->generateNewFiles($data) + if ($this->generateNewFiles($data) && + $this->updateModuleJson($data, false, $viewPublic) && + $this->modules->{$data['module_type']}->add($data) ) { if ($data['createrepo'] == true) { - if ($data['module_type'] === 'views' && $data['base_view_module_id'] == 0) {//Create public repository as well + if ($data['module_type'] === 'views' && $data['is_subview'] == false) {//Create public repository as well if (!$this->checkRepo($data)) { if (strtolower($data['app_type']) !== 'core') { $newRepo['base'] = $this->createRepo($data); @@ -278,8 +285,12 @@ public function updateModule($data) $module = array_merge($module, $data); - if ($this->modules->{$data['module_type']}->update($module) && - $this->updateModuleJson($data, false, true) + $viewPublic = true; + if ($module['module_type'] === 'views' && $module['is_subview'] == true) { + $viewPublic = false; + } + if ($this->updateModuleJson($data, false, $viewPublic) && + $this->modules->{$data['module_type']}->update($module) ) { if ($data['module_type'] === 'components') { $this->addUpdateComponentMenu($data); @@ -377,26 +388,217 @@ public function updateModule($data) public function removeModule($data) { - if ($data['module_type'] !== 'core') { - if (isset($data['module_type']) && $data['module_type'] === 'apptypes') { - $this->apps->types->removeAppType($data); - $this->addResponse('Removed app type from DB. Remove files manually...'); + try { + if ($data['module_type'] !== 'apptypes') { + $module = $this->modules->{$data['module_type']}->getById($data['id']); + } else { + $module = $this->apps->types->getById($data['id']); + } - return true; + if ($data['module_type'] !== 'bundles') { + if ($data['module_type'] !== 'views' && + $data['module_type'] !== 'apptypes' + ) { + $classArr = explode('\\', $module['class']); + + $classArr = array_slice($classArr, 0, -1); + + $class = implode('\\', $classArr) . '\\Install\\Install'; + + $path = lcfirst(str_replace('\\', '/', $class) . '.php'); + + try { + if ($this->localContent->fileExists($path)) { + $class = new $class; + + if (method_exists($class, 'uninstall')) { + $class->init()->uninstall(true); + } + } + } catch (FilesystemException | UnableToCheckExistence | \throwable $e) { + $this->addResponse($e->getMessage(), 1); + + return false; + } + } + + if (isset($data['remove_files']) && + $data['remove_files'] == 'true' && + !$this->cleanup($this->getModuleFilesLocation($module)) + ) { + return false; + } + + if ($data['module_type'] === 'views' && + $module['is_subview'] == false + ) { + if (isset($data['remove_files']) && + $data['remove_files'] == 'true' && + !$this->cleanup($this->getModuleFilesLocation($module, true)) + ) { + return false; + } + } } - $module = $this->modules->{$data['module_type']}->getById($data['id']); - } else { - $this->addResponse('Cannot remove Core!.', 1); + //Remove the module + if ($data['module_type'] === 'apptypes') { + $this->apps->types->removeAppType($data); + } else { + $this->modules->{$module['module_type']}->remove($module['id']); + } + + $this->addResponse('Removed module from DB & files from the system...'); + + return true; + } catch (\throwable $e) { + $this->addResponse($e->getMessage(), 1); return false; } + } + + public function cleanup($modulePath) + { + $files = $this->basepackages->utils->scanDir($modulePath); + + if (count($files['files']) > 0) { + try { + foreach ($files['files'] as $file) { + $this->localContent->delete($file); + } + } catch (FilesystemException | UnableToDeleteFile | \throwable $e) { + $this->addResponse($e->getMessage(), 1); + + return false; + } + } + + if (count($files['dirs']) > 0) { + try { + foreach ($files['dirs'] as $dir) { + $this->localContent->deleteDirectory($dir); + } - if ($module && $this->modules->{$data['module_type']}->remove($module['id'])) { - $this->addResponse('Removed module from DB. Remove files manually...'); + //cleanup path by checking if any of the path directory is empty. If empty, we delete the directory. + $pathArr = explode('/', $modulePath); + + foreach ($pathArr as $path) { + $path = null;//We dont need path as we will be popping it in the end. + + $checkPath = join('/', $pathArr); + + $folders = $this->localContent->listContents($checkPath)->toArray(); + + if (count($folders) === 0) { + $this->localContent->deleteDirectory($checkPath); + } else if (count($folders) === 1) { + $filePath = $folders[0]->path(); + + if (str_contains($filePath, '.gitkeep')) { + $this->localContent->delete($filePath); + $this->localContent->deleteDirectory($checkPath); + } + } + + array_pop($pathArr); + } + } catch (FilesystemException | UnableToDeleteFile | UnableToDeleteDirectory | \throwable $e) { + $this->addResponse($e->getMessage(), 1); + + return false; + } } else { - $this->addResponse('Error removing module.', 1); + try { + $this->localContent->deleteDirectory($modulePath); + } catch (FilesystemException | UnableToDeleteFile | UnableToDeleteDirectory | \throwable $e) { + $this->addResponse($e->getMessage(), 1); + + return false; + } + } + + return true; + } + + protected function getModuleFilesLocation($module, $viewPublic = false) + { + if (!isset($module['module_type']) && + ($module['app_type'] === strtolower($module['name'])) + ) { + return 'apps/' . ucfirst($module['app_type']) . '/'; + } else if ($module['module_type'] === 'components') { + $moduleLocation = 'apps/' . ucfirst($module['app_type']) . '/Components/'; + + $routeArr = explode('/', $module['route']); + + foreach ($routeArr as &$path) { + $path = ucfirst($path); + } + + $routePath = implode('/', $routeArr) . '/'; + } else if ($module['module_type'] === 'packages') { + $moduleLocation = 'apps/' . ucfirst($module['app_type']) . '/Packages/'; + + $pathArr = preg_split('/(?=[A-Z])/', ucfirst($module['name']), -1, PREG_SPLIT_NO_EMPTY); + + $routePath = implode('/', $pathArr) . '/'; + } else if ($module['module_type'] === 'middlewares') { + $moduleLocation = 'apps/' . ucfirst($module['app_type']) . '/Middlewares/'; + + $routePath = $module['name'] . '/'; + } else if ($module['module_type'] === 'views') { + $moduleLocation = 'apps/' . ucfirst($module['app_type']) . '/Views/'; + + if ($viewPublic) { + $moduleLocation = 'public/' . $module['app_type'] . '/' . strtolower($module['name']) . '/'; + + return $moduleLocation; + } + + if ($module['is_subview'] == 0) { + $routePath = $module['name'] . '/'; + } else { + if (is_string($module['dependencies'])) { + $module['dependencies'] = $this->helper->decode($module['dependencies'], true); + } + if (!isset($module['dependencies']['views']) || + (isset($module['dependencies']['views']) && count($module['dependencies']['views']) === 0) + ) { + throw new \Exception('Base view dependencies for sub view missing in module dependencies.'); + } + + foreach ($module['dependencies']['views'] as $view) { + $view = $this->modules->views->getViewByRepo($view['repo']); + + if ($view && $view['is_subview'] == false) { + $baseView = $view; + + break; + } + } + + if (!isset($baseView)) { + throw new \Exception('Base view dependencies for sub view not found on the system.'); + } + + $pathArr = preg_split('/(?=[A-Z])/', ucfirst($module['name']), -1, PREG_SPLIT_NO_EMPTY); + + if (count($pathArr) > 1) { + foreach ($pathArr as &$path) { + $path = strtolower($path); + } + } else { + $pathArr[0] = strtolower($pathArr[0]); + } + + $module['route'] = implode('/', $pathArr); + + $routePath = $baseView['name'] . '/html/' . $module['route'] . '/'; + } } + + return $moduleLocation . $routePath; } protected function runInstallUninstallTruncateTable($data) @@ -1457,7 +1659,7 @@ protected function generateNewPackagesModelFiles($data, $moduleFilesLocation) protected function generateNewViewsFiles($moduleFilesLocation, $data) { - if ($data['base_view_module_id'] == 0) { + if ($data['is_subview'] == false) { $modulePublicFilesLocation = $this->getNewFilesLocation($data, true); try { diff --git a/apps/Core/Views/Default/html/devtools/modules/select.html b/apps/Core/Views/Default/html/devtools/modules/select.html index 6fbb4c888..b00af3869 100644 --- a/apps/Core/Views/Default/html/devtools/modules/select.html +++ b/apps/Core/Views/Default/html/devtools/modules/select.html @@ -201,7 +201,7 @@
+ \ No newline at end of file diff --git a/apps/Core/Views/Default/html/devtools/modules/select.html b/apps/Core/Views/Default/html/devtools/modules/select.html index f0dc3b342..85b8eb608 100644 --- a/apps/Core/Views/Default/html/devtools/modules/select.html +++ b/apps/Core/Views/Default/html/devtools/modules/select.html @@ -461,6 +461,7 @@ } }, 'json'); } + $('#{{componentId}}-{{sectionId}}-generate-new-release').off(); $('#{{componentId}}-{{sectionId}}-generate-new-release').click(function() { if ($('#{{componentId}}-{{sectionId}}-include_core_modules')[0].checked === true) { From 691eb3d9a75c2c149bdf632d08a7b8fe6380f84b Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Wed, 19 Feb 2025 21:54:48 +1100 Subject: [PATCH 06/20] fix issue #619 --- .../Views/Default/html/modules/modules.html | 93 +++++++++++++++++-- .../html/modules/modules/dependencies.html | 15 +++ .../ModulesServiceProvider/Manager.php | 4 + 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 apps/Core/Views/Default/html/modules/modules/dependencies.html diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index e21e23164..074c46865 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -201,6 +201,11 @@
Select module from the tre 'tabTitle' : 'Change logs', 'tabInclude' : 'modules/modules/changelogs' ], + 'dependencies' : + [ + 'tabTitle' : 'Dependencies', + 'tabInclude' : 'modules/modules/dependencies' + ], 'settings' : [ 'tabTitle' : 'Settings', @@ -786,7 +791,13 @@
Select module from the tre } } } -dataCollectionSectionForm['funcs']['moduleinfo'] = function(show = ['noinfo'], showButtons = ['cancel'], showSettings = true, showBundleModules = false, showChangeLogs = false) { +dataCollectionSectionForm['funcs']['moduleinfo'] = function(show = ['noinfo'], + showButtons = ['cancel'], + showSettings = true, + showBundleModules = false, + showChangeLogs = false, + showDependencies = true + ) { $('#{{componentId}}-{{sectionId}}-tabs-tabLinks a').removeClass('active'); $('#{{componentId}}-{{sectionId}}-tabs-tabContent .tab-pane').removeClass('active show'); $('#{{componentId}}-{{sectionId}}-tabs-info').addClass('active show'); @@ -807,6 +818,11 @@
Select module from the tre } else { $('a[href*="#{{componentId}}-{{sectionId}}-tabs-changelogs"]').parent().removeClass('d-none'); } + if (!showDependencies) { + $('a[href*="#{{componentId}}-{{sectionId}}-tabs-dependencies"]').parent().addClass('d-none'); + } else { + $('a[href*="#{{componentId}}-{{sectionId}}-tabs-dependencies"]').parent().removeClass('d-none'); + } if (show.length > 0) { var moduleinfos = ['repo', 'loader', 'info', 'noinfo', 'error', 'buttons']; @@ -954,6 +970,11 @@
Select module from the tre $('#developer-field').attr('hidden', true); $('#required_by-field').attr('hidden', true); $('#required_by').attr('hidden', true); + $('#update_available').html(moduleData.update_available); + $('#update_version').html(moduleData.update_version); + $($('#update_available').parents('.col')[0]).attr('hidden', false); + $($('#update_version').parents('.col')[0]).attr('hidden', false); + $('#updated_on').html(moduleData.updated_on); } else if (moduleData.developer) { $('#developer').html(moduleData.developer); $('#category-field').attr('hidden', true); @@ -961,18 +982,16 @@
Select module from the tre $('#required_by-field').attr('hidden', false); $('#required_by').html(BazHelpers.createHtmlList({'obj': moduleData.required_by})); $('#required_by').attr('hidden', false); + $($('#update_available').parents('.col')[0]).attr('hidden', true); + $($('#update_version').parents('.col')[0]).attr('hidden', true); + $($('#updated_on').parents('.col')[0]).attr('hidden', true); } - $('#update_available').html(moduleData.update_available); - $('#update_version').html(moduleData.update_version); - $($('#update_available').parents('.col')[0]).attr('hidden', false); - $($('#update_version').parents('.col')[0]).attr('hidden', false); $($('#installed').parents('.col')[0]).attr('hidden', false); if (moduleData['module_type'] === 'bundles') { $($('#update_available').parents('.col')[0]).attr('hidden', true); $($('#update_version').parents('.col')[0]).attr('hidden', true); $($('#installed').parents('.col')[0]).attr('hidden', true); } - $('#updated_on').html(moduleData.updated_on); $('#installed').html(moduleData.installed); $('#version').html(moduleData.version); $('#updated_by').html(moduleData.updated_by); @@ -1196,6 +1215,68 @@
Select module from the tre } } } + $('a[href*="#{{componentId}}-{{sectionId}}-tabs-dependencies"]').parent().addClass('d-none'); + } else { + var dependenciesModuleHtml = ''; + + if (moduleData.dependencies && Object.keys(moduleData.dependencies).length > 0) { + for (var dependencyModuleType in moduleData.dependencies) { + if (dependencyModuleType === 'core' || dependencyModuleType === 'apptype') { + if (moduleData.dependencies[dependencyModuleType].length === 0) { + continue; + } + dependenciesModuleHtml += + ' ' + + ' ' + moduleData.dependencies[dependencyModuleType]['name'] + '' + + ' ' + dependencyModuleType + '' + + ' ' + moduleData.dependencies[dependencyModuleType]['version'] + '' + + ' ' + moduleData.dependencies[dependencyModuleType]['repo'] + '' + + ' '; + } else if(dependencyModuleType === 'externals' && + moduleData.dependencies[dependencyModuleType]['composer'] && + moduleData.dependencies[dependencyModuleType]['composer']['require'] && + Object.keys(moduleData.dependencies[dependencyModuleType]['composer']['require']).length > 0 + ) { + for (var dependenciesComposerPackage in moduleData.dependencies[dependencyModuleType]['composer']['require']) { + dependenciesModuleHtml += + ' ' + + ' ' + dependenciesComposerPackage + '' + + ' ' + dependencyModuleType + '' + + ' ' + moduleData.dependencies[dependencyModuleType]['composer']['require'][dependenciesComposerPackage] + '' + + ' Via composer' + + ' '; + } + } else { + if (Array.isArray(moduleData.dependencies[dependencyModuleType]) && moduleData.dependencies[dependencyModuleType].length > 0) { + $(moduleData.dependencies[dependencyModuleType]).each(function(i, v) { + dependenciesModuleHtml += + ' ' + + ' ' + v['name'] + '' + + ' ' + dependencyModuleType + '' + + ' ' + v['version'] + '' + + ' ' + v['repo'] + '' + + ' '; + }); + } + } + } + } + + $('#{{componentId}}-{{sectionId}}-dependencies-table tbody').empty().html(dependenciesModuleHtml); + + $(window).on('load', function() { + if (!$.fn.DataTable.isDataTable('#{{componentId}}-{{sectionId}}-dependencies-table')) { + $('#{{componentId}}-{{sectionId}}-dependencies-table').DataTable({ + columns: [ + null, + null, + null, + null, + ] + } + ); + } + }); } } diff --git a/apps/Core/Views/Default/html/modules/modules/dependencies.html b/apps/Core/Views/Default/html/modules/modules/dependencies.html new file mode 100644 index 000000000..de04855c8 --- /dev/null +++ b/apps/Core/Views/Default/html/modules/modules/dependencies.html @@ -0,0 +1,15 @@ +
+
+ + + + + + + + + + +
NameModule TypeVersionRepository
+
+
\ No newline at end of file diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index 12d8eaa9d..5a54ce75d 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -88,6 +88,10 @@ public function getModuleInfo($data) } if (isset($module) && is_array($module)) { + if (is_string($module['dependencies'])) { + $module['dependencies'] = $this->helper->decode($module['dependencies'], true); + } + if (array_key_exists('notification_subscriptions', $module)) { unset($module['notification_subscriptions']); } From eafa5a6d361c1172f49b97e577acc07b30c51145 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Wed, 19 Feb 2025 21:55:49 +1100 Subject: [PATCH 07/20] update issue #618 --- .../Devtools/Modules/DevtoolsModules.php | 1 - .../html/devtools/modules/bundle/modules.html | 4 ++-- .../Default/html/devtools/modules/module.html | 20 +++++++++---------- .../Views/Default/html/modules/modules.html | 4 ++-- .../ModulesServiceProvider/Installer.php | 9 ++++++--- .../ModulesServiceProvider/Manager.php | 3 +++ .../ModulesServiceProvider/Queues.php | 6 +++++- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 4dbe26d65..f62a2c3f9 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -936,7 +936,6 @@ public function getDefaultDependencies($type, $isSubView = false) $defaultDependencies['middlewares'] = []; $defaultDependencies['views'] = []; $defaultDependencies['bundles'] = []; - $defaultDependencies['externals'] = $externalDependencies; } $this->addResponse('Generated default dependencies', 0, ['defaultDependencies' => $defaultDependencies]); diff --git a/apps/Core/Views/Default/html/devtools/modules/bundle/modules.html b/apps/Core/Views/Default/html/devtools/modules/bundle/modules.html index a50faf8b8..2ebd65f5a 100644 --- a/apps/Core/Views/Default/html/devtools/modules/bundle/modules.html +++ b/apps/Core/Views/Default/html/devtools/modules/bundle/modules.html @@ -212,13 +212,13 @@ 'fieldId' : 'bundle_modules', 'fieldLabel' : 'Bundle Modules', 'fieldType' : 'textarea', - 'fieldDataMaxLength' : 4096, + 'fieldDataMaxLength' : 32768, 'fieldHelp' : true, 'fieldHelpTooltipContent' : 'Bundle Modules', 'fieldBazScan' : true, 'fieldBazPostOnCreate' : true, 'fieldBazPostOnUpdate' : true, - 'fieldDataInputMaxLength' : 4096, + 'fieldDataInputMaxLength' : 32768, 'fieldTextareaRows' : 15, 'fieldValue' : bundleModules ] diff --git a/apps/Core/Views/Default/html/devtools/modules/module.html b/apps/Core/Views/Default/html/devtools/modules/module.html index 0379314e7..44de2b47b 100644 --- a/apps/Core/Views/Default/html/devtools/modules/module.html +++ b/apps/Core/Views/Default/html/devtools/modules/module.html @@ -1007,7 +1007,7 @@ '#{{componentId}}-{{sectionId}}-modules-external-version' ).on('keyup', function() { if ($(this).val() !== '') { - label = 'external'; + label = 'externals'; $('#{{componentId}}-{{sectionId}}-modules').attr('disabled', true); $('#{{componentId}}-{{sectionId}}-modules-external-add, ' + '#{{componentId}}-{{sectionId}}-modules-external-remove').attr('disabled', false); @@ -1079,9 +1079,9 @@ dataCollectionSectionForm['vars']['bundleModules'][label]['version'] = moduleData['version']; dataCollectionSectionForm['vars']['bundleModules'][label]['repo'] = moduleData['repo']; - } else if (label === 'external') { - if (dataCollectionSectionForm['vars']['bundleModules']['external']['composer']['require'].length === 0) { - dataCollectionSectionForm['vars']['bundleModules']['external']['composer']['require'] = { }; + } else if (label === 'externals') { + if (dataCollectionSectionForm['vars']['bundleModules']['externals']['composer']['require'].length === 0) { + dataCollectionSectionForm['vars']['bundleModules']['externals']['composer']['require'] = { }; } dataCollectionSectionForm['vars']['bundleModules'][label]['composer']['require'][$('#{{componentId}}-{{sectionId}}-modules-external').val()] @@ -1126,7 +1126,7 @@ label = 'apptype'; } dataCollectionSectionForm['vars']['bundleModules'][label] = { }; - } else if (label === 'external') { + } else if (label === 'externals') { delete dataCollectionSectionForm['vars']['bundleModules'][label]['composer']['require'][$('#{{componentId}}-{{sectionId}}-modules-external').val()]; } else { for (var modules in dataCollectionSectionForm['vars']['bundleModules']) { @@ -1531,9 +1531,9 @@ } if (dataCollectionSectionForm['vars']['module_type'] !== 'views' && dataCollectionSectionForm['vars']['module_type'] !== 'core' && - !dataCollectionSectionForm['vars']['moduleDependencies']['external'] + !dataCollectionSectionForm['vars']['moduleDependencies']['externals'] ) { - dataCollectionSectionForm['vars']['moduleDependencies']['external'] = { }; + dataCollectionSectionForm['vars']['moduleDependencies']['externals'] = { }; } dataCollectionSection = @@ -3093,7 +3093,7 @@ '#{{componentId}}-{{sectionId}}-dependencies-external-version' ).on('keyup', function() { if ($(this).val() !== '') { - label = 'external'; + label = 'externals'; $('#{{componentId}}-{{sectionId}}-dependencies-modules').attr('disabled', true); $('#{{componentId}}-{{sectionId}}-dependencies-external-add, ' + '#{{componentId}}-{{sectionId}}-dependencies-external-remove').attr('disabled', false); @@ -3196,7 +3196,7 @@ dataCollectionSectionForm['vars']['moduleDependencies']['apptype']['name'] = $('#{{componentId}}-{{sectionId}}-dependencies-modulename').val(); dataCollectionSectionForm['vars']['moduleDependencies']['apptype']['version'] = $('#{{componentId}}-{{sectionId}}-dependencies-moduleversion').val(); dataCollectionSectionForm['vars']['moduleDependencies']['apptype']['repo'] = $('#{{componentId}}-{{sectionId}}-dependencies-modulerepo').val(); - } else if (label === 'external') { + } else if (label === 'externals') { if (dataCollectionSectionForm['vars']['module_type'] === 'core') { if (!dataCollectionSectionForm['vars']['moduleDependencies']['composer']) { dataCollectionSectionForm['vars']['moduleDependencies']['composer'] = { }; @@ -3265,7 +3265,7 @@ dataCollectionSectionForm['vars']['moduleDependencies'][label] = { }; } else if (label === 'apptypes') { dataCollectionSectionForm['vars']['moduleDependencies']['apptype'] = { }; - } else if (label === 'external') { + } else if (label === 'externals') { if (dataCollectionSectionForm['vars']['module_type'] === 'core') { if (dataCollectionSectionForm['vars']['moduleDependencies']['composer']['require'][$('#{{componentId}}-{{sectionId}}-dependencies-external').val()]) { delete dataCollectionSectionForm['vars']['moduleDependencies']['composer']['require'][$('#{{componentId}}-{{sectionId}}-dependencies-external').val()]; diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index 074c46865..95df1df55 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -872,7 +872,7 @@
Select module from the tre moduleType = 'views'; } else if (selected.startsWith('bundles')) { moduleType = 'bundles'; - } else if (selected.startsWith('external')) { + } else if (selected.startsWith('externals')) { moduleType = 'externals'; } } @@ -1136,7 +1136,7 @@
Select module from the tre ' ' + moduleData.bundle_modules[bundleModuleType]['version'] + '' + ' ' + moduleData.bundle_modules[bundleModuleType]['repo'] + '' + ' '; - } else if(bundleModuleType === 'external' && + } else if(bundleModuleType === 'externals' && moduleData.bundle_modules[bundleModuleType]['composer'] && moduleData.bundle_modules[bundleModuleType]['composer']['require'] && Object.keys(moduleData.bundle_modules[bundleModuleType]['composer']['require']).length > 0 diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index ab99dfaa9..dba9a2950 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -1723,7 +1723,8 @@ protected function addProgressMethods(&$methods, $module, $taskName, $forTask, $ ] ); if ($module['module_type'] !== 'views' && - $module['module_type'] !== 'apptype' + $module['module_type'] !== 'apptype' && + $module['module_type'] !== 'externals' ) { array_push($methods, [ @@ -1852,7 +1853,8 @@ protected function registerRunProcessProgressMethods() ); if ($module['module_type'] !== 'views' && - $module['module_type'] !== 'apptype' + $module['module_type'] !== 'apptype' && + $module['module_type'] !== 'externals' ) { array_push($this->runProcessProgressMethods, [ @@ -2037,7 +2039,8 @@ protected function removeModule($args) if ($module['module_type'] !== 'bundles') { if ($module['module_type'] !== 'views' && - $module['module_type'] !== 'apptype' + $module['module_type'] !== 'apptype' && + $module['module_type'] !== 'externals' ) { $classArr = explode('\\', $moduleToRemove['class']); diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index 5a54ce75d..ef55a3325 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -237,12 +237,15 @@ public function updateModuleRepoDetails($module, $data = null) if ($latestReleaseJson) { $module['repo_details']['latestRelease']['moduleJson'] = $this->remoteModulesJson[$module['module_type']][$module['name']]; + if ($module['module_type'] === 'bundles') { $module['update_available'] = null; $module['update_version'] = null; $module['installed'] = null; $module['version'] = $module['repo_details']['latestRelease']['name']; + $module['bundle_modules'] = $module['repo_details']['latestRelease']['moduleJson']['bundle_modules']; } else { + $module['dependencies'] = $module['repo_details']['latestRelease']['moduleJson']['dependencies']; if ($module['installed'] == '1') { $module['update_available'] = '1'; $module['update_version'] = $module['repo_details']['latestRelease']['name']; diff --git a/system/Base/Providers/ModulesServiceProvider/Queues.php b/system/Base/Providers/ModulesServiceProvider/Queues.php index 8fd5b4d85..df43324f6 100644 --- a/system/Base/Providers/ModulesServiceProvider/Queues.php +++ b/system/Base/Providers/ModulesServiceProvider/Queues.php @@ -1039,7 +1039,11 @@ protected function addToQueueTasksAndResults($taskName, $moduleType, $module, $v } else { $this->queueTasks[$taskName][$moduleType][$module['id']]['version'] = $version; } - $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = $module['repo']; + if ($moduleType === 'externals') { + $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = 'Via composer'; + } else { + $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = $module['repo']; + } if (isset($module['composerJsonFile'])) { $this->queueTasks[$taskName][$moduleType][$module['id']]['composerJsonFile'] = $module['composerJsonFile']; From 4a353c83c180eab1a81eff66289cd5747bf3742e Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Thu, 20 Feb 2025 19:28:02 +1100 Subject: [PATCH 08/20] udpate issue #618. Fixed the error. Added remove function for external packages. --- .../Views/Default/html/modules/modules.html | 198 ++++--- .../ModulesServiceProvider/Installer.php | 518 +++++++++++------- .../ModulesServiceProvider/Manager.php | 6 +- .../ModulesServiceProvider/Queues.php | 175 +++--- 4 files changed, 520 insertions(+), 377 deletions(-) diff --git a/apps/Core/Views/Default/html/modules/modules.html b/apps/Core/Views/Default/html/modules/modules.html index 95df1df55..938d14d34 100644 --- a/apps/Core/Views/Default/html/modules/modules.html +++ b/apps/Core/Views/Default/html/modules/modules.html @@ -980,7 +980,7 @@
Select module from the tre $('#category-field').attr('hidden', true); $('#developer-field').attr('hidden', false); $('#required_by-field').attr('hidden', false); - $('#required_by').html(BazHelpers.createHtmlList({'obj': moduleData.required_by})); + $('#required_by').html(BazHelpers.createHtmlList({'obj': moduleData.required_by_modules_names})); $('#required_by').attr('hidden', false); $($('#update_available').parents('.col')[0]).attr('hidden', true); $($('#update_version').parents('.col')[0]).attr('hidden', true); @@ -1039,87 +1039,6 @@
Select module from the tre $('#{{componentId}}-{{sectionId}}-level_of_update').val(moduleInfo.level_of_update).trigger('change'); } - if (moduleData['module_type'] === 'bundles') { - if ((dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) || - (dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type], moduleInfo.id) > -1) || - (dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type], moduleInfo.id) > -1) - ) { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['install', 'uninstall', 'remove', 'repo-sync']); - } - } else { - if (moduleInfo.installed == '1') { - if (moduleInfo.update_available == '1') { - if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type] && - (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type], moduleInfo.id) > -1) - ) { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); - } - } else { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove'], false); - } - } - } else { - if ((dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) || - (dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type], moduleInfo.id) > -1) || - (dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type] && - Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type]).length > 0 && - BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type], moduleInfo.id) > -1) - ) { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); - } - } else { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove'], false); - } - } - } - } else { - if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type]) { - index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type], moduleData.id); - } - if (!index && dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type]) { - index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type], moduleData.id); - } - - if (index > -1) { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel'], false); - } - } else { - if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove'], false); - } - } - } - } - if (moduleData['module_type'] === 'bundles') { var bundleModuleHtml = ''; @@ -1181,40 +1100,105 @@
Select module from the tre ); } }); - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], [], true, true); - } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], []); - if (moduleData['app_type'] === 'core') { - if (moduleInfo['name'] !== 'Core' && moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info'], [], false); - } else { - if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleData.module_type]) { - index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleData.module_type], moduleData.id); + dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['install', 'repo-sync'], false, true, false, false); + } else { + if (moduleInfo.installed == '1') { + if (moduleInfo.update_available == '1') { + if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type] && + (BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleInfo.module_type], moduleInfo.id) > -1) + ) { + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); + } + } else { + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['update', 'uninstall', 'remove'], false); + } } - - if (index !== 'undefined' && index > -1) { + } else { + if ((dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleInfo.module_type], moduleInfo.id) > -1) || + (dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['uninstall'][moduleInfo.module_type], moduleInfo.id) > -1) || + (dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type] && + Object.keys(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type]).length > 0 && + BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleInfo.module_type], moduleInfo.id) > -1) + ) { if (moduleData['module_type'] !== 'externals') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel', 'repo-sync']); } else { - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel'], false); + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['cancel'], false); } } else { if (moduleData['module_type'] !== 'externals') { - if (moduleInfo.update_available == '1') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['update', 'repo-sync']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['repo-sync']); - } + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['uninstall', 'remove', 'repo-sync']); } else { - if (moduleInfo.update_available == '1') { - dataCollectionSectionForm['funcs']['moduleinfo']([], ['update']); - } else { - dataCollectionSectionForm['funcs']['moduleinfo']([], false, false); - } + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], ['remove'], false); } } } + } else { + if (dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type]) { + index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['install'][moduleData.module_type], moduleData.id); + } + if (!index && dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type]) { + index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['remove'][moduleData.module_type], moduleData.id); + } + + if (index > -1) { + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['cancel'], false); + } + } else { + if (moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove', 'repo-sync']); + } else { + dataCollectionSectionForm['funcs']['moduleinfo']([], ['install', 'remove'], false); + } + } + } + + dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], []); + + if (moduleData['app_type'] === 'core') { + if (moduleInfo['name'] !== 'Core' && moduleData['module_type'] !== 'externals') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info'], [], false); + // } else { + // if (dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleData.module_type]) { + // index = BazHelpers.getKeyByValue(dataCollectionSectionForm['vars']['queue']['tasks']['update'][moduleData.module_type], moduleData.id); + // } + + // if (index !== 'undefined' && index > -1) { + // if (moduleData['module_type'] !== 'externals') { + // dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + // } else { + // dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel'], false); + // } + // } else { + // if (moduleData['module_type'] !== 'externals') { + // if (moduleInfo.update_available == '1') { + // dataCollectionSectionForm['funcs']['moduleinfo']([], ['update', 'repo-sync']); + // } else { + // dataCollectionSectionForm['funcs']['moduleinfo']([], ['repo-sync']); + // } + // } else { + // if (moduleInfo.update_available == '1') { + // dataCollectionSectionForm['funcs']['moduleinfo']([], ['update']); + // } else { + // dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['remove'], false); + // } + // } + // } + } $('a[href*="#{{componentId}}-{{sectionId}}-tabs-dependencies"]').parent().addClass('d-none'); } else { var dependenciesModuleHtml = ''; @@ -1475,7 +1459,9 @@
Select module from the tre $('#queue-counter').empty().html(dataCollectionSectionForm['vars']['queue']['total']); if (task === 'install') { - dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + if (moduleType !== 'bundles') { + dataCollectionSectionForm['funcs']['moduleinfo'](['info', 'buttons'], ['cancel', 'repo-sync']); + } if (moduleType === 'apptype') { dataCollectionSectionForm['funcs']['initQueueButtons'](); } else { diff --git a/system/Base/Providers/ModulesServiceProvider/Installer.php b/system/Base/Providers/ModulesServiceProvider/Installer.php index dba9a2950..d21fee8a0 100644 --- a/system/Base/Providers/ModulesServiceProvider/Installer.php +++ b/system/Base/Providers/ModulesServiceProvider/Installer.php @@ -311,13 +311,23 @@ protected function precheckQueueData($args) return true; } } else { + if (isset($this->modulesToInstallOrUpdate['required_by'])) { + $checkForCore = $this->preCheckModuleAppsBinding($taskName, $module, true); + + if (!$checkForCore) { + return $checkForCore; + } + } + if ($this->queue['settings']['installer']['forceUninstall']) { $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs'] = 'Precheck ignored due to force uninstall.'; return true; } - if (isset($this->modulesToInstallOrUpdate['apps'])) { + if (isset($this->modulesToInstallOrUpdate['apps']) || + isset($this->modulesToInstallOrUpdate['required_by']) + ) { return $this->preCheckModuleAppsBinding($taskName, $module); } @@ -360,25 +370,66 @@ protected function precheckQueueData($args) return false; } - protected function preCheckModuleAppsBinding($taskName, $module) + protected function preCheckModuleAppsBinding($taskName, $module, $checkForCore = false) { try { - if (is_string($this->modulesToInstallOrUpdate['apps'])) { - $this->modulesToInstallOrUpdate['apps'] = $this->helper->decode($this->modulesToInstallOrUpdate['apps'], true); - } + if (isset($this->modulesToInstallOrUpdate['apps'])) { + if (is_string($this->modulesToInstallOrUpdate['apps'])) { + $this->modulesToInstallOrUpdate['apps'] = $this->helper->decode($this->modulesToInstallOrUpdate['apps'], true); + } - if (count($this->modulesToInstallOrUpdate['apps']) > 0) { - foreach ($this->modulesToInstallOrUpdate['apps'] as $appId => $appSettings) { - if (array_key_exists('enabled', $appSettings) && $appSettings['enabled'] == true) { - $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'fail'; + if (count($this->modulesToInstallOrUpdate['apps']) > 0) { + foreach ($this->modulesToInstallOrUpdate['apps'] as $appId => $appSettings) { + if (array_key_exists('enabled', $appSettings) && $appSettings['enabled'] == true) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'fail'; - $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; + $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; - return $this->queueHasErrors( - 'Module ' . $this->modulesToInstallOrUpdate['name'] . ' (' . $this->modulesToInstallOrUpdate['module_type'] . ') is assigned to app with ID: ' . $appId . '. Either remove it via app or use force uninstall in the queue settings.', - $preCheckQueueLogs, - true - ); + return $this->queueHasErrors( + 'Module ' . $this->modulesToInstallOrUpdate['name'] . ' (' . $this->modulesToInstallOrUpdate['module_type'] . ') is assigned to app with ID: ' . $appId . '. Either remove it via app or use force uninstall in the queue settings.', + $preCheckQueueLogs, + true + ); + } + } + } + } else if (isset($this->modulesToInstallOrUpdate['required_by'])) { + if (is_string($this->modulesToInstallOrUpdate['required_by'])) { + $this->modulesToInstallOrUpdate['required_by'] = $this->helper->decode($this->modulesToInstallOrUpdate['required_by'], true); + } + + if (count($this->modulesToInstallOrUpdate['required_by']) > 0) { + foreach ($this->modulesToInstallOrUpdate['required_by'] as $moduleType => $requiredModulesArr) { + if (count($requiredModulesArr) > 0) { + foreach ($requiredModulesArr as $requiredModule) { + $moduleIsInstalled = $this->modules->$moduleType->getById($requiredModule); + + if ($moduleIsInstalled && + $checkForCore && + $moduleIsInstalled['name'] === 'Core' + ) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'fail'; + + $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; + + return $this->queueHasErrors( + 'Module ' . $this->modulesToInstallOrUpdate['display_name'] . ' (' . $this->modulesToInstallOrUpdate['module_type'] . ') is required by ' . $moduleType . ' with ID: ' . $moduleIsInstalled['id'] . ' (' . $moduleIsInstalled['display_name'] . '). This module cannot be removed. Please remove the external module from the queue and contact developer if you want to get this external module removed.', + $preCheckQueueLogs, + true + ); + } else if ($moduleIsInstalled) { + $this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck'] = 'fail'; + + $preCheckQueueLogs = &$this->queue['results'][$taskName][$module['module_type']][$module['id']]['precheck_logs']; + + return $this->queueHasErrors( + 'Module ' . $this->modulesToInstallOrUpdate['display_name'] . ' (' . $this->modulesToInstallOrUpdate['module_type'] . ') is required by ' . $moduleType . ' with ID: ' . $moduleIsInstalled['id'] . ' (' . $moduleIsInstalled['display_name'] . '). Uninstall the module first or use force uninstall in the queue settings.', + $preCheckQueueLogs, + true + ); + } + } + } } } } @@ -399,155 +450,166 @@ protected function preCheckModuleAppsBinding($taskName, $module) protected function processExternalPackages($args) { + $taskName = $args[0]; $module = $args[1]; $precheck = $args[2]; + $externalComposerFileName = str_replace('/', '_', $module['display_name']) . '_composer.json'; if ($module['module_type'] === 'externals') { if ($precheck) { - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['precheck'] = 'fail'; - $preCheckQueueLogs = &$this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['precheck_logs']; + $this->queue['results'][$taskName]['externals'][$module['id']]['precheck'] = 'fail'; + $preCheckQueueLogs = &$this->queue['results'][$taskName]['externals'][$module['id']]['precheck_logs']; } else { - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['result'] = 'fail'; - $resultQueueLogs = &$this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['result_logs']; + $this->queue['results'][$taskName]['externals'][$module['id']]['result'] = 'fail'; + $resultQueueLogs = &$this->queue['results'][$taskName]['externals'][$module['id']]['result_logs']; } - if (isset($module['hasPatch']) && $module['hasPatch'] === true) { - if (!isset($module['composerJsonFile']['extra']['patches'][$module['name']])) { - $this->cleanup(['composer']); + if ($taskName !== 'uninstall' && $taskName !== 'remove') { + if (isset($module['hasPatch']) && $module['hasPatch'] === true) { + if (!isset($module['composerJsonFile']['extra']['patches'][$module['name']])) { + $this->cleanup(['composer']); - if ($precheck) { - return $this->queueHasErrors( - 'External packages should have package defined, but are missing from the composer json file for : ' . $module['name'], - $preCheckQueueLogs - ); - } else { - return $this->queueHasErrors( - 'External packages should have package defined, but are missing from the composer json file for : ' . $module['name'], - $resultQueueLogs, - false - ); + if ($precheck) { + return $this->queueHasErrors( + 'External packages should have package defined, but are missing from the composer json file for : ' . $module['name'], + $preCheckQueueLogs + ); + } else { + return $this->queueHasErrors( + 'External packages should have package defined, but are missing from the composer json file for : ' . $module['name'], + $resultQueueLogs, + false + ); + } } - } - $patches = $this->basepackages->utils->scanDir($this->downloadLocation . - $module['root_module']['repo_details']['details']['name'] . '-' . - $module['root_module']['repo_details']['latestRelease']['name'] . '/' . - $module['root_module']['repo_details']['details']['name'] . '-' . - $module['root_module']['repo_details']['latestRelease']['name'] . '/external/patches/', - false - ); + $patches = $this->basepackages->utils->scanDir($this->downloadLocation . + $module['root_module']['repo_details']['details']['name'] . '-' . + $module['root_module']['repo_details']['latestRelease']['name'] . '/' . + $module['root_module']['repo_details']['details']['name'] . '-' . + $module['root_module']['repo_details']['latestRelease']['name'] . '/external/patches/', + false + ); - $patches['files'] = arrayFilterKeywords($patches['files'], ['.patch']); + $patches['files'] = arrayFilterKeywords($patches['files'], ['.patch']); - if (count($patches['files']) === 0) { - $this->cleanup(['composer']); + if (count($patches['files']) === 0) { + $this->cleanup(['composer']); - if ($precheck) { - return $this->queueHasErrors( - 'External package requires a patch which is missing from the repository : ' . $module['root_module']['repo'], - $preCheckQueueLogs - ); - } else { - return $this->queueHasErrors( - 'External package requires a patch which is missing from the repository : ' . $module['root_module']['repo'], - $resultQueueLogs, - false - ); + if ($precheck) { + return $this->queueHasErrors( + 'External package requires a patch which is missing from the repository : ' . $module['root_module']['repo'], + $preCheckQueueLogs + ); + } else { + return $this->queueHasErrors( + 'External package requires a patch which is missing from the repository : ' . $module['root_module']['repo'], + $resultQueueLogs, + false + ); + } } - } - $modulePatchName = str_replace(['/','-'], ['_','_'], $module['name']); - $patches['files'] = arrayFilterKeywords($patches['files'], [$modulePatchName]); + $modulePatchName = str_replace(['/','-'], ['_','_'], $module['name']); + $patches['files'] = arrayFilterKeywords($patches['files'], [$modulePatchName]); - if (count($patches['files']) !== count($module['composerJsonFile']['extra']['patches'][$module['name']])) { - $this->cleanup(['composer']); + if (count($patches['files']) !== count($module['composerJsonFile']['extra']['patches'][$module['name']])) { + $this->cleanup(['composer']); - if ($precheck) { - return $this->queueHasErrors( - 'External package number of patches do not match what is defined in the composer json file for repository : ' . $module['root_module']['repo'], - $preCheckQueueLogs - ); - } else { - return $this->queueHasErrors( - 'External package number of patches do not match what is defined in the composer json file for repository : ' . $module['root_module']['repo'], - $resultQueueLogs, - false - ); + if ($precheck) { + return $this->queueHasErrors( + 'External package number of patches do not match what is defined in the composer json file for repository : ' . $module['root_module']['repo'], + $preCheckQueueLogs + ); + } else { + return $this->queueHasErrors( + 'External package number of patches do not match what is defined in the composer json file for repository : ' . $module['root_module']['repo'], + $resultQueueLogs, + false + ); + } + } + + $foundAll = []; + foreach ($patches['files'] as $file) { + $fileName = $this->helper->last(explode('/', $file)); + foreach ($module['composerJsonFile']['extra']['patches'][$module['name']] as $key => $patch) { + $foundAll[$key] = 'false'; + if (str_contains($patch, $fileName)) { + $foundAll[$key] = 'true'; + } + } + } + + if (in_array('false', $foundAll)) { + $this->cleanup(['composer']); + + if ($precheck) { + return $this->queueHasErrors( + 'External package all patches not found in the external/patches directory as per the composer json file for repository : ' . $module['root_module']['repo'], + $preCheckQueueLogs + ); + } else { + return $this->queueHasErrors( + 'External package all patches not found in the external/patches directory as per the composer json file for repository : ' . $module['root_module']['repo'], + $resultQueueLogs, + false + ); + } } - } - $foundAll = []; - foreach ($patches['files'] as $file) { - $fileName = $this->helper->last(explode('/', $file)); - foreach ($module['composerJsonFile']['extra']['patches'][$module['name']] as $key => $patch) { - $foundAll[$key] = 'false'; - if (str_contains($patch, $fileName)) { - $foundAll[$key] = 'true'; + try { + foreach ($patches['files'] as $file) { + $fileName = $this->helper->last(explode('/', $file)); + + $this->localContent->copy($file, 'external/patches/' . $fileName); } + } catch (FilesystemException | UnableToCopyFile $e) { + $this->cleanup(['composer']); + + return $this->queueHasErrors('Error copying file : ' . $fileName, $preCheckQueueLogs); } } - if (in_array('false', $foundAll)) { + try { + $this->localContent->write('external/' . $externalComposerFileName, $this->helper->encode($module['composerJsonFile'])); + } catch (FilesystemException | UnableToWriteFile $e) { $this->cleanup(['composer']); if ($precheck) { return $this->queueHasErrors( - 'External package all patches not found in the external/patches directory as per the composer json file for repository : ' . $module['root_module']['repo'], + 'Error writing file external package composer file : ' . $externalComposerFileName, $preCheckQueueLogs ); } else { return $this->queueHasErrors( - 'External package all patches not found in the external/patches directory as per the composer json file for repository : ' . $module['root_module']['repo'], + 'Error writing file external package composer file : ' . $externalComposerFileName, $resultQueueLogs, false ); } } - - try { - foreach ($patches['files'] as $file) { - $fileName = $this->helper->last(explode('/', $file)); - - $this->localContent->copy($file, 'external/patches/' . $fileName); - } - } catch (FilesystemException | UnableToCopyFile $e) { - $this->cleanup(['composer']); - - return $this->queueHasErrors('Error copying file : ' . $fileName, $preCheckQueueLogs); - } } try { - $externalComposerFileName = str_replace('/', '_', $module['name']) . '_composer.json'; + putenv('COMPOSER_HOME=' . base_path('external/')); + if ($taskName !== 'uninstall' && $taskName !== 'remove') { + putenv('COMPOSER=' . $externalComposerFileName); + } - $this->localContent->write('external/' . $externalComposerFileName, $this->helper->encode($module['composerJsonFile'])); - } catch (FilesystemException | UnableToWriteFile $e) { - $this->cleanup(['composer']); + $stream = fopen(base_path('external/' . str_replace('_composer.json', '', $externalComposerFileName) . '.install'), 'w'); - if ($precheck) { - return $this->queueHasErrors( - 'Error writing file external package composer file : ' . $externalComposerFileName, - $preCheckQueueLogs - ); - } else { - return $this->queueHasErrors( - 'Error writing file external package composer file : ' . $externalComposerFileName, - $resultQueueLogs, - false - ); + $process = 'install'; + if ($taskName === 'uninstall' || $taskName === 'remove') { + $process = 'remove ' . $module['display_name']; } - } - - try { - putenv('COMPOSER_HOME=' . base_path('external/')); - putenv('COMPOSER=' . $externalComposerFileName); - $stream = fopen(base_path('external/' . $externalComposerFileName . '.install'), 'w'); if ($precheck) { - $input = new \Symfony\Component\Console\Input\StringInput('install --dry-run -d ' . base_path('external/')); + $input = new \Symfony\Component\Console\Input\StringInput($process . ' --dry-run -d ' . base_path('external/')); } else { - $input = new \Symfony\Component\Console\Input\StringInput('install -d ' . base_path('external/')); + $input = new \Symfony\Component\Console\Input\StringInput($process . ' -d ' . base_path('external/')); } + $output = new \Symfony\Component\Console\Output\StreamOutput($stream); $application = new \Composer\Console\Application(); @@ -555,11 +617,15 @@ protected function processExternalPackages($args) $app = $application->run($input, $output); - $installLogs = $this->localContent->read('external/' . $externalComposerFileName . '.install'); - } catch (\throwable | UnableToReadFile $e) { + $installLogs = $this->localContent->read('external/' . str_replace('_composer.json', '', $externalComposerFileName) . '.install'); + } catch (\throwable | UnableToReadFile | UnableToWriteFile $e) { $this->cleanup(['composer']); - return $this->queueHasErrors($e->getMessage(), $preCheckQueueLogs, $precheck); + if ($precheck) { + return $this->queueHasErrors($e->getMessage(), $preCheckQueueLogs, $precheck); + } else { + return $this->queueHasErrors($e->getMessage(), $resultQueueLogs, $precheck); + } } if ($app !== 0) { @@ -573,57 +639,65 @@ protected function processExternalPackages($args) } if ($precheck) { - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['precheck'] = 'pass'; - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['precheck_logs'] = $installLogs; + $this->queue['results'][$taskName]['externals'][$module['id']]['precheck'] = 'pass'; + $this->queue['results'][$taskName]['externals'][$module['id']]['precheck_logs'] = $installLogs; } else { - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['result'] = 'pass'; - $this->queue['results']['first']['externals'][explode('/', $module['name'])[1]]['result_logs'] = $installLogs; + $this->queue['results'][$taskName]['externals'][$module['id']]['result'] = 'pass'; + $this->queue['results'][$taskName]['externals'][$module['id']]['result_logs'] = $installLogs; //Merge package information to composer.json - try { - $this->localContent->write('external/composer.json', $this->helper->encode(array_replace($this->getComposerJsonFile(), $module['composerJsonFile']))); - } catch (FilesystemException | UnableToWriteFile $e) { - return $this->queueHasErrors('Could not rewrite the composer.json file with new package information: ' . $module['name'], $resultQueueLogs, false); - } + if ($taskName !== 'uninstall' && $taskName !== 'remove') { + try { + $this->localContent->write('external/composer.json', $this->helper->encode(array_replace($this->getComposerJsonFile(), $module['composerJsonFile']))); + } catch (FilesystemException | UnableToWriteFile $e) { + return $this->queueHasErrors('Could not rewrite the composer.json file with new package information: ' . $module['name'], $resultQueueLogs, false); + } - //add to externals DB - $installedComposerPackages = $this->getComposerPackageInfo(); - try { - $installedComposerPackages = $this->helper->decode($installedComposerPackages, true); - } catch (\throwable $e) { - return $this->queueHasErrors($e->getMessage(), $resultQueueLogs, false); - } - $externalPackageNameArr = explode('/', $module['name']); - - $externalPackage = $this->modules->externals->getExternalByName($externalPackageNameArr[1]); - foreach ($installedComposerPackages['installed'] as $installedComposerPackagesKey => $installedComposerPackage) { - $installedComposerPackages[$installedComposerPackage['name']] = $installedComposerPackage; - } - unset($installedComposerPackages['installed']); - - if ($externalPackage) { - $externalPackage['version'] = - (isset($installedComposerPackages[$module['name']]['version'])) ? $installedComposerPackages[$module['name']]['version'] : ''; - $externalPackage['description'] = - (isset($installedComposerPackages[$module['name']]['description'])) ? $installedComposerPackages[$module['name']]['description'] : ''; - $externalPackage['patches'] = - (isset($module['composerJsonFile']['extra']['patches'][$module['name']])) ? - $this->helper->encode($module['composerJsonFile']['extra']['patches'][$module['name']]) : - $this->helper->encode([]); - $externalPackage['abandoned'] = - (isset($installedComposerPackages[$module['name']]['abandoned'])) ? (($installedComposerPackages[$module['name']]['abandoned'] == true) ? 1 : 0) : 0; - - if (isset($externalPackage['required_by'])) { - if (is_string($externalPackage['required_by'])) { - $externalPackage['required_by'] = $this->helper->decode($externalPackage['required_by'], true); - } + //add to externals DB + try { + $installedComposerPackages = $this->getComposerPackageInfo(); - if (isset($externalPackage['required_by'][$module['root_module']['module_type']])) { - if (is_array($externalPackage['required_by'][$module['root_module']['module_type']]) && - count($externalPackage['required_by'][$module['root_module']['module_type']]) > 0 - ) { - if (!in_array($module['root_module']['id'], $externalPackage['required_by'][$module['root_module']['module_type']])) { - array_push($externalPackage['required_by'][$module['root_module']['module_type']], $module['root_module']['id']); + $installedComposerPackages = $this->helper->decode($installedComposerPackages, true); + } catch (\throwable $e) { + return $this->queueHasErrors($e->getMessage(), $resultQueueLogs, false); + } + + $externalPackageNameArr = explode('/', $module['name']); + + $externalPackage = $this->modules->externals->getExternalByName($externalPackageNameArr[1]); + + foreach ($installedComposerPackages['installed'] as $installedComposerPackagesKey => $installedComposerPackage) { + $installedComposerPackages[$installedComposerPackage['name']] = $installedComposerPackage; + } + + unset($installedComposerPackages['installed']); + + if ($externalPackage) { + $externalPackage['version'] = + (isset($installedComposerPackages[$module['name']]['version'])) ? $installedComposerPackages[$module['name']]['version'] : ''; + $externalPackage['description'] = + (isset($installedComposerPackages[$module['name']]['description'])) ? $installedComposerPackages[$module['name']]['description'] : ''; + $externalPackage['patches'] = + (isset($module['composerJsonFile']['extra']['patches'][$module['name']])) ? + $this->helper->encode($module['composerJsonFile']['extra']['patches'][$module['name']]) : + $this->helper->encode([]); + $externalPackage['abandoned'] = + (isset($installedComposerPackages[$module['name']]['abandoned'])) ? (($installedComposerPackages[$module['name']]['abandoned'] == true) ? 1 : 0) : 0; + + if (isset($externalPackage['required_by'])) { + if (is_string($externalPackage['required_by'])) { + $externalPackage['required_by'] = $this->helper->decode($externalPackage['required_by'], true); + } + + if (isset($externalPackage['required_by'][$module['root_module']['module_type']])) { + if (is_array($externalPackage['required_by'][$module['root_module']['module_type']]) && + count($externalPackage['required_by'][$module['root_module']['module_type']]) > 0 + ) { + if (!in_array($module['root_module']['id'], $externalPackage['required_by'][$module['root_module']['module_type']])) { + array_push($externalPackage['required_by'][$module['root_module']['module_type']], $module['root_module']['id']); + } + } else { + $externalPackage['required_by'] = $this->helper->encode(['packages' => [$module['root_module']['id']]]); } } else { $externalPackage['required_by'] = $this->helper->encode(['packages' => [$module['root_module']['id']]]); @@ -631,39 +705,48 @@ protected function processExternalPackages($args) } else { $externalPackage['required_by'] = $this->helper->encode(['packages' => [$module['root_module']['id']]]); } - } else { - $externalPackage['required_by'] = $this->helper->encode(['packages' => [$module['root_module']['id']]]); - } - $this->modules->externals->update($externalPackage); - } else { - $externalPackage = - [ - 'developer' => $externalPackageNameArr[0], - 'name' => $externalPackageNameArr[1], - 'display_name' => $module['name'], - 'description' => - (isset($installedComposerPackages[$module['name']]['description'])) ? $installedComposerPackages[$module['name']]['description'] : '', - 'module_type' => 'externals', - 'app_type' => 'core', - 'version' => - (isset($installedComposerPackages[$module['name']]['version'])) ? $installedComposerPackages[$module['name']]['version'] : '', - 'patches' => - (isset($module['composerJsonFile']['extra']['patches'][$module['name']])) ? - $this->helper->encode($module['composerJsonFile']['extra']['patches'][$module['name']]) : - $this->helper->encode([]), - 'abandoned' => - (isset($installedComposerPackages[$module['name']]['abandoned'])) ? (($installedComposerPackages[$module['name']]['abandoned'] == true) ? 1 : 0) : 0, - 'installed' => 1, - 'required_by' => $this->helper->encode(['packages' => [$module['root_module']['id']]]), - 'updated_by' => 0 - ]; + $this->modules->externals->update($externalPackage); + } else { + $bindToModules = []; + if (isset($module['bind_to_modules']) && is_array($module['bind_to_modules']) && count($module['bind_to_modules']) > 0) { + foreach ($module['bind_to_modules'] as $bindToModule) { + if (!isset($bindToModules[$bindToModule['module_type']])) { + $bindToModules[$bindToModule['module_type']] = []; + } - if ($this->access->auth->account() && isset($this->access->auth->account()['id'])) { - $externalPackage['updated_by'] = $this->access->auth->account()['id']; + array_push($bindToModules[$bindToModule['module_type']], $bindToModule['id']); + } } - $this->modules->externals->add($externalPackage); + $externalPackage = + [ + 'developer' => $externalPackageNameArr[0], + 'name' => $externalPackageNameArr[1], + 'display_name' => $module['name'], + 'description' => + (isset($installedComposerPackages[$module['name']]['description'])) ? $installedComposerPackages[$module['name']]['description'] : '', + 'module_type' => 'externals', + 'app_type' => 'core', + 'version' => + (isset($installedComposerPackages[$module['name']]['version'])) ? $installedComposerPackages[$module['name']]['version'] : '', + 'patches' => + (isset($module['composerJsonFile']['extra']['patches'][$module['name']])) ? + $this->helper->encode($module['composerJsonFile']['extra']['patches'][$module['name']]) : + $this->helper->encode([]), + 'abandoned' => + (isset($installedComposerPackages[$module['name']]['abandoned'])) ? (($installedComposerPackages[$module['name']]['abandoned'] == true) ? 1 : 0) : 0, + 'installed' => 1, + 'required_by' => $this->helper->encode($bindToModules), + 'updated_by' => 0 + ]; + + if ($this->access->auth->account() && isset($this->access->auth->account()['id'])) { + $externalPackage['updated_by'] = $this->access->auth->account()['id']; + } + + $this->modules->externals->add($externalPackage); + } } $this->cleanup(['composer']); @@ -1677,6 +1760,16 @@ protected function registerRunPrecheckProgressMethods() 'args' => [$taskName, $module], ] ); + + if ($moduleType === 'externals') { + array_push($this->runPrecheckProgressMethods, + [ + 'method' => 'processExternalPackages-' . $module['id'] . '-' . strtolower(str_replace(' ', '', $module['name'])), + 'text' => 'Perform precheck for external package ' . $module['name'] . ' (' . ucfirst($module['module_type']) . ') ...', + 'args' => [$taskName, $module, true], + ] + ); + } } } } @@ -1864,6 +1957,16 @@ protected function registerRunProcessProgressMethods() ] ); } + + if ($moduleType === 'externals') { + array_push($this->runProcessProgressMethods, + [ + 'method' => 'processExternalPackages-' . $module['id'] . '-' . strtolower(str_replace(' ', '', $module['name'])), + 'text' => 'Process external package ' . $module['name'] . ' (' . ucfirst($module['module_type']) . ') ...', + 'args' => [$taskName, $module, false], + ] + ); + } } } } @@ -2069,20 +2172,25 @@ protected function removeModule($args) } } - $cleanup = $this->cleanup(['modulePath'], $this->getModuleFilesLocation($moduleToRemove)); - - if ($cleanup !== true) { - return $cleanup; - } - - if ($module['module_type'] === 'views' && - $moduleToRemove['is_subview'] == false - ) { - $cleanup = $this->cleanup(['modulePath'], $this->getModuleFilesLocation($moduleToRemove, true)); + if ($module['module_type'] === 'externals') { + //Execute Composer + // + } else { + $cleanup = $this->cleanup(['modulePath'], $this->getModuleFilesLocation($moduleToRemove)); if ($cleanup !== true) { return $cleanup; } + + if ($module['module_type'] === 'views' && + $moduleToRemove['is_subview'] == false + ) { + $cleanup = $this->cleanup(['modulePath'], $this->getModuleFilesLocation($moduleToRemove, true)); + + if ($cleanup !== true) { + return $cleanup; + } + } } } diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index ef55a3325..5cfc71879 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -88,7 +88,9 @@ public function getModuleInfo($data) } if (isset($module) && is_array($module)) { - if (is_string($module['dependencies'])) { + if (isset($module['dependencies']) && + is_string($module['dependencies']) + ) { $module['dependencies'] = $this->helper->decode($module['dependencies'], true); } @@ -162,7 +164,7 @@ public function getModuleInfo($data) } } - $module['required_by'] = $requiredModules; + $module['required_by_modules_names'] = $requiredModules; } } diff --git a/system/Base/Providers/ModulesServiceProvider/Queues.php b/system/Base/Providers/ModulesServiceProvider/Queues.php index df43324f6..bc8f46376 100644 --- a/system/Base/Providers/ModulesServiceProvider/Queues.php +++ b/system/Base/Providers/ModulesServiceProvider/Queues.php @@ -795,8 +795,6 @@ protected function processBundleModules($taskName, $module) } } else { if ($bundleType === 'externals') { - $this->checkComposerAndAddToQueue($bundles, $module); - continue; } @@ -947,13 +945,11 @@ protected function checkComposerAndAddToQueue($composerPackages, $module) $hasPatch = false; if ($composerJsonFile && isset($composerJsonFile['require'])) { - if (!isset($composerJsonFile['require'][$composerPackage]) || - (isset($composerJsonFile['require'][$composerPackage]) && - $composerJsonFile['require'][$composerPackage] !== $version) - ) { - $composerJsonFile['require'][$composerPackage] = $version; - $installExternal = true; - } + //We bind the external package to the internal component/package/middleware. + //When we uninstal a component/package/middleware, we also remove the composer package. + //If a composer package is being shared by multiple modules, it is not removed. + //If the module that is being removed is the only one that this composer package requires, composer package will also be removed. + $composerJsonFile['require'][$composerPackage] = $version; if (isset($composerPackages['config']['allow-plugins'][$composerPackage]) && !isset($composerJsonFile['config']['allow-plugins'][$composerPackage]) @@ -971,21 +967,34 @@ protected function checkComposerAndAddToQueue($composerPackages, $module) } } - if ($installExternal || $hasConfigChange || $hasPatch) { - $package['id'] = explode('/', $composerPackage)[1]; - $package['name'] = $composerPackage; - $package['repo'] = 'Via composer'; - $package['composerJsonFile'] = $composerJsonFile; - if ($hasConfigChange) { - $package['hasConfigChange'] = true; - } - if ($hasPatch) { - $package['hasPatch'] = true; - } - $package['root_module'] = $module; - - $this->addToQueueTasksAndResults('first', 'externals', $package, $version); + $package['id'] = explode('/', $composerPackage)[1]; + $package['name'] = $composerPackage; + $package['repo'] = 'Via composer'; + $package['composerJsonFile'] = $composerJsonFile; + if ($hasConfigChange) { + $package['hasConfigChange'] = true; + } + if ($hasPatch) { + $package['hasPatch'] = true; } + $package['root_module'] = $module; + $package['root_module'] = + arraySqueeze( + $package['root_module'], + ['id', 'name', 'display_name', 'module_type', 'repo', 'repo_details'] + ); + $package['root_module']['repo_details']['details'] = + arraySqueeze( + $package['root_module']['repo_details']['details'], + ['name', 'internal', 'private'] + ); + $package['root_module']['repo_details']['latestRelease'] = + arraySqueeze( + $package['root_module']['repo_details']['latestRelease'], + ['name', 'tag_name', 'published_at', 'zipball_url'] + ); + + $this->addToQueueTasksAndResults('first', 'externals', $package, $version); } else { $package['id'] = '0'; $package['name'] = $composerPackage; @@ -1013,64 +1022,78 @@ protected function addToQueueTasksAndResults($taskName, $moduleType, $module, $v $this->queueTasks[$taskName][$moduleType][$module['id']]['name'] = $module['name']; $this->queueTasks[$taskName][$moduleType][$module['id']]['display_name'] = $module['display_name'] ?? $module['name']; $this->queueTasks[$taskName][$moduleType][$module['id']]['module_type'] = $moduleType; + if ($moduleType === 'components' && array_key_exists('route', $module)) { $this->queueTasks[$taskName][$moduleType][$module['id']]['route'] = $module['route']; } - if ($moduleType === 'views' && array_key_exists('is_subview', $module)) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['is_subview'] = $module['is_subview']; - if ($module['is_subview']) { - $repo = strtolower($this->helper->last(explode('/', $module['repo']))); - $names = explode('-', $repo); - array_pop($names); - $this->queueTasks[$taskName][$moduleType][$module['id']]['base_view_name'] = $this->helper->last($names); + + if ($moduleType === 'views') { + if (array_key_exists('is_subview', $module)) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['is_subview'] = $module['is_subview']; + + if ($module['is_subview']) { + $repo = strtolower($this->helper->last(explode('/', $module['repo']))); + $names = explode('-', $repo); + array_pop($names); + $this->queueTasks[$taskName][$moduleType][$module['id']]['base_view_name'] = $this->helper->last($names); + } } - } - if ($moduleType === 'views' && array_key_exists('is_public', $module)) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['is_public'] = $module['is_public']; - } - if ($moduleType !== 'externals') { - if (array_key_exists('app_type', $module)) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['app_type'] = $module['app_type']; + + if (array_key_exists('is_public', $module)) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['is_public'] = $module['is_public']; } } + if (!$version) { $this->queueTasks[$taskName][$moduleType][$module['id']]['version'] = - (($taskName === 'update' || $taskName === 'first') && $module['update_version'] && $module['update_version'] !== '') ? $module['version'] . ' -> ' . $module['update_version'] : $module['version']; + (($taskName === 'update' || $taskName === 'first') && $module['update_version'] && $module['update_version'] !== '') ? + $module['version'] . ' -> ' . $module['update_version'] : + $module['version']; } else { $this->queueTasks[$taskName][$moduleType][$module['id']]['version'] = $version; } + if ($moduleType === 'externals') { $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = 'Via composer'; - } else { - $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = $module['repo']; - } - if (isset($module['composerJsonFile'])) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['composerJsonFile'] = $module['composerJsonFile']; - if (isset($module['hasConfigChange'])) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['hasConfigChange'] = true; + if (isset($module['composerJsonFile'])) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['composerJsonFile'] = $module['composerJsonFile']; + + if (isset($module['hasConfigChange'])) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['hasConfigChange'] = true; + } + if (isset($module['hasPatch'])) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['hasPatch'] = true; + } + if (isset($module['root_module'])) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['root_module'] = $module['root_module']; + $this->queueTasks[$taskName][$moduleType][$module['id']]['bind_to_modules'] = [$module['root_module']]; + } } - if (isset($module['hasPatch'])) { - $this->queueTasks[$taskName][$moduleType][$module['id']]['hasPatch'] = true; + } else { + if (array_key_exists('app_type', $module)) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['app_type'] = $module['app_type']; } + $this->queueTasks[$taskName][$moduleType][$module['id']]['repo'] = $module['repo']; + } + } else { + if ($moduleType === 'externals') { if (isset($module['root_module'])) { - $module['root_module'] = - arraySqueeze( - $module['root_module'], - ['id', 'name', 'display_name', 'module_type', 'repo', 'repo_details'] - ); - $module['root_module']['repo_details']['details'] = - arraySqueeze( - $module['root_module']['repo_details']['details'], - ['name', 'internal', 'private'] - ); - $module['root_module']['repo_details']['latestRelease'] = - arraySqueeze( - $module['root_module']['repo_details']['latestRelease'], - ['name', 'tag_name', 'published_at', 'zipball_url'] - ); - - $this->queueTasks[$taskName][$moduleType][$module['id']]['root_module'] = $module['root_module']; + array_push($this->queueTasks[$taskName][$moduleType][$module['id']]['bind_to_modules'], $module['root_module']); + } + if ($taskName === 'install' || $taskName === 'first') { + //We compare the version of what is already in the queue and if additional modules have the same external package, + //we compare the versions and change the version to a higher version. + if (isset($this->queueTasks[$taskName][$moduleType][$module['id']]['version']) && + isset($version) + ) { + $currentVersion = $this->getComposerPackageVersion($this->queueTasks[$taskName][$moduleType][$module['id']]['version']); + $moduleVersion = $this->getComposerPackageVersion($version); + + if (Version::greaterThan($moduleVersion, $currentVersion)) { + $this->queueTasks[$taskName][$moduleType][$module['id']]['version'] = $version; + } + } } } } @@ -1084,4 +1107,28 @@ protected function addToQueueTasksAndResults($taskName, $moduleType, $module, $v $this->results[$taskName][$moduleType][$module['id']]['result_logs'] = '-'; } } + + protected function getComposerPackageVersion($version) + { + //Remove ^ + $version = str_replace('^', '', $version); + //Remove .* + $version = str_replace('.*', '', $version); + + $versionArr = explode('.', $version); + + //Remove leading zeros (.0.0) + if (count($versionArr) < 3) { + if (count($versionArr) === 1) { + $versionArr[1] = '0'; + $versionArr[2] = '0'; + } else if (count($versionArr) === 2) { + $versionArr[2] = '0'; + } + + $version = implode('.', $versionArr); + } + + return $version; + } } \ No newline at end of file From ac327f609d0c58ea4d65e6b1c2939109f37e9ed9 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 21 Feb 2025 15:23:18 +1100 Subject: [PATCH 09/20] fix issue #621 --- .../Devtools/Modules/DevtoolsModules.php | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index f62a2c3f9..38121b5f3 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -1219,7 +1219,7 @@ protected function getModuleJsonFileLocation(&$data) } } - protected function generateNewFiles($data) + protected function generateNewFiles(&$data) { $moduleFilesLocation = $this->getNewFilesLocation($data); @@ -1320,7 +1320,7 @@ protected function getNewFilesLocation($data, $viewPublic = false) } } - protected function generateNewComponentsFiles($moduleFilesLocation, $data) + protected function generateNewComponentsFiles($moduleFilesLocation, &$data) { $this->addUpdateComponentMenu($data); @@ -1334,9 +1334,9 @@ protected function generateNewComponentsFiles($moduleFilesLocation, $data) return false; } - $data['class'] = explode('\\', $data['class']); - unset($data['class'][$this->helper->lastKey($data['class'])]); - $namespaceClass = implode('\\', $data['class']); + $dataClass = explode('\\', $data['class']); + unset($dataClass[$this->helper->lastKey($dataClass)]); + $namespaceClass = implode('\\', $dataClass); $file = str_replace('"NAMESPACE"', 'namespace ' . $namespaceClass, $file); $file = str_replace('"COMPONENTNAME"', $componentName, $file); @@ -1351,7 +1351,7 @@ protected function generateNewComponentsFiles($moduleFilesLocation, $data) } if (isset($data['widgets']) && $data['widgets'] !== '') { - $data['widgets'] = $this->helper->decode($data['widgets'], true); + $dataWidgets = $this->helper->decode($data['widgets'], true); try { $file = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/ComponentWidget.txt'); @@ -1364,7 +1364,7 @@ protected function generateNewComponentsFiles($moduleFilesLocation, $data) $file = str_replace('"NAMESPACE"', 'namespace ' . $namespaceClass, $file); - foreach ($data['widgets'] as $widget) { + foreach ($dataWidgets as $widget) { try { $methodFile = $this->localContent->read('apps/Core/Packages/Devtools/Modules/Files/ComponentWidgetMethod.txt'); } catch (FilesystemException | UnableToReadFile $exception) { @@ -1724,7 +1724,7 @@ protected function generateNewViewsFiles($moduleFilesLocation, $data) return true; } - protected function addUpdateComponentMenu($data) + protected function addUpdateComponentMenu(&$data) { if ($data['menu_id'] != '' && $data['menu_id'] != '0') { if (!isset($data['is_clone']) || @@ -1760,12 +1760,13 @@ protected function addUpdateComponentMenu($data) $menu = $this->basepackages->menus->addMenu($data); if ($menu) { - $module = $this->modules->{$data['module_type']}->packagesData->last; + // $module = $this->modules->{$data['module_type']}->packagesData->last; - $module['menu_id'] = $menu['id']; + // $module['menu_id'] = $menu['id']; + $data['menu_id'] = $menu['id']; } - $this->modules->{$data['module_type']}->update($module); + // $this->modules->{$data['module_type']}->update($module); } } } From a177adf85fc2357d641059038d71453e16bf03a6 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Fri, 21 Feb 2025 20:34:25 +1100 Subject: [PATCH 10/20] update issue #622 --- .../Api/Client/Services/ServicesComponent.php | 7 ++- .../Devtools/Migrator/DevtoolsMigrator.php | 2 +- .../Devtools/Modules/DevtoolsModules.php | 2 +- .../ApiClientServices/Apis/Repos.php | 2 + .../ApiClientServices/ApiClientServices.php | 8 +++ .../ApiClientServices/ApiClientServices.php | 58 ++++++++++++++----- .../ModulesServiceProvider/Manager.php | 2 +- 7 files changed, 64 insertions(+), 17 deletions(-) diff --git a/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php b/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php index 89ef066d3..8c161be78 100644 --- a/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php +++ b/apps/Core/Components/System/Api/Client/Services/ServicesComponent.php @@ -100,10 +100,15 @@ function ($dataArr) { ] ]; + $conditions = + [ + 'conditions' => '-|app_type|equals|' . $this->apps->getAppInfo()['app_type'] . '&' + ]; + $this->generateDTContent( $this->apiPackage, 'system/api/client/services/view', - null, + $conditions, ['name', 'category', 'provider', 'in_use', 'used_by', 'setup'], true, ['name', 'category', 'provider', 'in_use', 'used_by', 'setup'], diff --git a/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php b/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php index fd761d88c..a2df6f548 100644 --- a/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php +++ b/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php @@ -665,7 +665,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } } } else { - $apisArr = $this->basepackages->apiClientServices->getAll()->apiClientServices; + $apisArr = $this->basepackages->apiClientServices->getApiByAppType(); } if (count($apisArr) > 0) { diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 38121b5f3..2a5b89128 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -3422,7 +3422,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } } } else { - $apisArr = $this->basepackages->apiClientServices->getAll()->apiClientServices; + $apisArr = $this->basepackages->apiClientServices->getApiByAppType(); } if (count($apisArr) > 0) { diff --git a/system/Base/Installer/Packages/Setup/Register/Basepackages/ApiClientServices/Apis/Repos.php b/system/Base/Installer/Packages/Setup/Register/Basepackages/ApiClientServices/Apis/Repos.php index 8ab1450e2..bccbde3a9 100644 --- a/system/Base/Installer/Packages/Setup/Register/Basepackages/ApiClientServices/Apis/Repos.php +++ b/system/Base/Installer/Packages/Setup/Register/Basepackages/ApiClientServices/Apis/Repos.php @@ -30,6 +30,7 @@ public function register($db, $ff, $postData) 'in_use' => 1, 'used_by' => json_encode($usedBy), 'setup' => 4, + 'app_type' => 'core', 'location' => 'basepackages' ]; @@ -52,6 +53,7 @@ public function register($db, $ff, $postData) 'in_use' => 1, 'used_by' => json_encode($usedBy), 'setup' => 4, + 'app_type' => 'core', 'location' => 'basepackages' ]; diff --git a/system/Base/Installer/Packages/Setup/Schema/Basepackages/ApiClientServices/ApiClientServices.php b/system/Base/Installer/Packages/Setup/Schema/Basepackages/ApiClientServices/ApiClientServices.php index dc83f3c29..a17f0db43 100644 --- a/system/Base/Installer/Packages/Setup/Schema/Basepackages/ApiClientServices/ApiClientServices.php +++ b/system/Base/Installer/Packages/Setup/Schema/Basepackages/ApiClientServices/ApiClientServices.php @@ -81,6 +81,14 @@ public function columns() 'notNull' => true ] ), + new Column( + 'app_type', + [ + 'type' => Column::TYPE_VARCHAR, + 'size' => 50, + 'notNull' => true, + ] + ), new Column( 'description', [ diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/ApiClientServices.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/ApiClientServices.php index a5bbc3680..cfcbafbf6 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/ApiClientServices.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/ApiClientServices.php @@ -132,18 +132,26 @@ protected function registerApiCategories() protected function registerApiLocations() { - $this->apiLocations = - [ - 'basepackages' => - [ - 'id' => 'basepackages', - 'name' => 'Base Packages' - ], - ]; + if ($this->apps->app['app_type'] === 'core') { + $this->apiLocations = + [ + 'basepackages' => + [ + 'id' => 'basepackages', + 'name' => 'Base Packages' + ], + ]; + } else { + $this->apiLocations = []; + } $appTypes = $this->apps->types->types; foreach ($appTypes as $type) { + if ($type['app_type'] === 'core') { + continue; + } + $this->apiLocations[$type['app_type']]['id'] = $type['app_type']; $this->apiLocations[$type['app_type']]['name'] = $type['name']; } @@ -164,9 +172,9 @@ protected function switchApiModel($api = null) $this->setModelToUse($modelClass . 'BasepackagesApiClientServicesApis' . $api['category'] . $api['provider']); } else { - $modelClass = 'Apps\\' . $api['location'] . '\\Packages\\System\\ApiClientServices\\Apis\\' . $api['category'] . '\\' . $api['provider'] . '\\'; + $modelClass = 'Apps\\' . $api['location'] . '\\Packages\\Apis\\' . $api['category'] . '\\' . $api['provider'] . '\\'; - $this->setModelToUse($modelClass . 'Model\\SystemApiApis' . $api['category'] . $api['provider']); + $this->setModelToUse($modelClass . 'Model\\Apps' . $api['location'] . 'Apis' . $api['category'] . $api['provider']); } $this->packageName = 'apiApis' . $api['category'] . $api['provider']; @@ -185,6 +193,7 @@ public function addApi(array $data) if ($data['provider'] === 'github' || $data['provider'] === 'gitea') { $data['location'] = 'basepackages'; } + $data['app_type'] = $this->apps->getAppInfo()['app_type']; $data = $this->encryptPassToken($data); @@ -218,22 +227,24 @@ public function updateApi(array $data) if ($data['provider'] === 'github' || $data['provider'] === 'gitea') { $data['location'] = 'basepackages'; } + $data['app_type'] = $this->apps->getAppInfo()['app_type']; $data = $this->encryptPassToken($data); $this->switchApiModel($data); - $api = $this->getById($data['id'], false, false); + $apiId = $data['id']; + unset($data['id']); + $api = $this->getById($data['api_category_id'], false, false); $api = array_merge($api, $data); if ($this->update($api)) { - $this->apiStats->initApiCallStats($api); $this->switchApiModel(); - $api['id'] = $api['api_category_id']; + $api['id'] = $apiId; if ($this->update($api)) { $this->addResponse('Updated ' . $data['name'] . ' API'); @@ -462,6 +473,27 @@ public function getApiByRepoUrl($url, $getApiClientServiceInfo = true) return false; } + public function getApiByAppType($appType = null) + { + if (!$appType) { + $appType = $this->apps->getAppInfo()['app_type']; + } + + $apisArr = $this->getAll()->apiClientServices; + + $apis = []; + + if (count($apisArr) > 0) { + foreach ($apisArr as $api) { + if ($api['app_type'] === $appType) { + array_push($apis, $api); + } + } + } + + return $apis; + } + protected function encryptPassToken(array $data) { if (isset($data['auth_type'])) { diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index 5cfc71879..bfa2953d9 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -1174,7 +1174,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } } } else { - $apisArr = $this->basepackages->apiClientServices->getAll()->apiClientServices; + $apisArr = $this->basepackages->apiClientServices->getApiByAppType(); } if (count($apisArr) > 0) { From 14fc0ce2e12dc463bd4aee3eb5d0b86453a9f666 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 01:27:03 +1100 Subject: [PATCH 11/20] fix issue #623 --- apps/Core/Packages/Devtools/Migrator/Install/Package.php | 6 +++++- system/Base/Installer/Packages/Setup.php | 6 +++++- system/Base/Providers/DatabaseServiceProvider/Ff.php | 7 ++++++- .../Base/Providers/ModulesServiceProvider/DbInstaller.php | 6 +++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/Core/Packages/Devtools/Migrator/Install/Package.php b/apps/Core/Packages/Devtools/Migrator/Install/Package.php index 7d2edc7bd..c04d01e2a 100644 --- a/apps/Core/Packages/Devtools/Migrator/Install/Package.php +++ b/apps/Core/Packages/Devtools/Migrator/Install/Package.php @@ -42,7 +42,11 @@ public function install($redoDB = false) $tableName = $tableClass['model']->getSource(); } - $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model'], $this->db); + $tableConfigParams = []; + if (isset($tableClass['configParams'])) { + $tableConfigParams = $tableClass['configParams']; + } + $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model'], $tableConfigParams); $schema = $this->ff->generateSchema($tableName, $tableClass['schema'], $tableClass['model']); if ($redoDB) { diff --git a/system/Base/Installer/Packages/Setup.php b/system/Base/Installer/Packages/Setup.php index 251b63762..49d2799fd 100644 --- a/system/Base/Installer/Packages/Setup.php +++ b/system/Base/Installer/Packages/Setup.php @@ -380,7 +380,11 @@ protected function buildSchema() $tableName = $tableClass['model']->getSource(); } - $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model']); + $tableConfigParams = []; + if (isset($tableClass['configParams'])) { + $tableConfigParams = $tableClass['configParams']; + } + $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model'], $tableConfigParams); $schema = $this->ff->generateSchema($tableName, $tableClass['schema'], $tableClass['model']); $this->ff->store($tableName, $config, $schema, $this->ff)->deleteStore(); diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff.php b/system/Base/Providers/DatabaseServiceProvider/Ff.php index 01e7f8716..1266ee7ff 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff.php @@ -313,9 +313,14 @@ public function generateSchema($tableName, $tableClass, $tableModel) return $schema; } - public function generateConfig($tableName, $tableClass, $tableModel) + public function generateConfig($tableName, $tableClass, $tableModel, $configArr = []) { $config = []; + + if (count($configArr) > 0) { + $config = array_merge($config, $configArr); + } + $config['indexes'] = []; if ($tableModel) { diff --git a/system/Base/Providers/ModulesServiceProvider/DbInstaller.php b/system/Base/Providers/ModulesServiceProvider/DbInstaller.php index 30ade2a32..80b9ae7cf 100644 --- a/system/Base/Providers/ModulesServiceProvider/DbInstaller.php +++ b/system/Base/Providers/ModulesServiceProvider/DbInstaller.php @@ -116,7 +116,11 @@ public function installDb($databases) $tableName = $tableClass['model']->getSource(); } - $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model']); + $tableConfigParams = []; + if (isset($tableClass['configParams'])) { + $tableConfigParams = $tableClass['configParams']; + } + $config = $this->ff->generateConfig($tableName, $tableClass['schema'], $tableClass['model'], $tableConfigParams); $schema = $this->ff->generateSchema($tableName, $tableClass['schema'], $tableClass['model']); $this->ff->store($tableName, $config, $schema, $this->ff); From 5741b36643ebdcdf99d8d94d3705fd247bb85105 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 05:13:04 +1100 Subject: [PATCH 12/20] Fix issue #624 --- .../Ff/Classes/IndexHandler.php | 49 ++++++++++++++---- .../DatabaseServiceProvider/Ff/Store.php | 50 +++++++++++++------ 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/IndexHandler.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/IndexHandler.php index 4eeea181b..26f912974 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/IndexHandler.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/IndexHandler.php @@ -56,9 +56,11 @@ public function __construct(array $storeConfiguration) } } - public function setIndex(string $content) + public function setIndex($content, $remove = false) { - $content = json_decode($content, true); + if (is_string($content)) { + $content = json_decode($content, true); + } $indexPointer = $content['id']; @@ -80,30 +82,30 @@ public function setIndex(string $content) $indexChars = strtolower(mb_substr($content, 0, $this->minIndexChars, 'UTF-8')); - $this->writeIndex($indexPointer, $index, $indexChars, $content); + $this->writeIndex($indexPointer, $index, $indexChars, $content, $remove); } } else { $indexChars = strtolower(mb_substr($content[$index], 0, $this->minIndexChars, 'UTF-8')); - $this->writeIndex($indexPointer, $index, $indexChars, $content[$index]); + $this->writeIndex($indexPointer, $index, $indexChars, $content[$index], $remove); } } else { - $this->writeIndex($indexPointer, $index, $content[$index], $content[$index]); + $this->writeIndex($indexPointer, $index, $content[$index], $content[$index], $remove); } } else { if (is_string($content[$index])) { $indexChars = strtolower(mb_substr($content[$index], 0, $this->minIndexChars, 'UTF-8')); - $this->writeIndex($indexPointer, $index, $indexChars, $content[$index]); + $this->writeIndex($indexPointer, $index, $indexChars, $content[$index], $remove); } else { - $this->writeIndex($indexPointer, $index, $content[$index], $content[$index]); + $this->writeIndex($indexPointer, $index, $content[$index], $content[$index], $remove); } } } } } - protected function writeIndex($indexPointer, $index, $indexChars, $content) + protected function writeIndex($indexPointer, $index, $indexChars, $content, $remove = false) { try { $indexFile = $this->getIndex($index, $indexChars); @@ -114,11 +116,25 @@ protected function writeIndex($indexPointer, $index, $indexChars, $content) } if (isset($indexJson[$content])) { - if (!in_array($indexPointer, $indexJson[$content])) { - array_push($indexJson[$content], $indexPointer); + if ($remove) { + $key = array_search($indexPointer, $indexJson[$content]); + + if ($key !== false) { + unset($indexJson[$content][$key]); + } + + if (count($indexJson[$content]) === 0) { + return IoHelper::deleteFile($this->indexesPath . $index . '/' . $indexChars . '.json'); + } + } else { + if (!in_array($indexPointer, $indexJson[$content])) { + array_push($indexJson[$content], $indexPointer); + } } } else { - $indexJson[$content] = [$indexPointer]; + if (!$remove) { + $indexJson[$content] = [$indexPointer]; + } } IoHelper::writeContentToFile($this->indexesPath . $index . '/' . $indexChars . '.json', json_encode($indexJson)); @@ -129,6 +145,17 @@ public function getIndex($index, $indexChars) return IoHelper::getFileContent($this->indexesPath . $index . '/' . $indexChars . '.json'); } + public function removeFromIndex($content) + { + $this->setIndex($content, true); + } + + public function resetIndex($remove, $add) + { + $this->setIndex($remove, true); + $this->setIndex($add); + } + public function removeIndex($index, $indexChars) { return IoHelper::deleteFile($this->indexesPath . $index . '/' . $indexChars . '.json'); diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php index 971107a36..28e78c7cf 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php @@ -471,10 +471,11 @@ public function updateOrInsert(array $data, bool $autoGenerateIdOnInsert = true) $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); if ($this->ff->mode === 'hybrid') { + if ($this->indexing) { if ($insert) { - $this->ff->addToSync($this->model, $data[$this->primaryKey]); + (new IndexHandler($this->storeConfiguration))->setIndex($dataJSON); } else { - $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + (new IndexHandler($this->storeConfiguration))->resetIndex($current, $dataJSON); } } @@ -541,10 +542,11 @@ public function updateOrInsertMany(array $data, bool $autoGenerateIdOnInsert = t } if ($this->ff->mode === 'hybrid') { + if ($this->indexing) { if ($insert) { - $this->ff->addToSync($this->model, $document[$this->primaryKey]); + (new IndexHandler($this->storeConfiguration))->setIndex($documentJSON); } else { - $this->ff->addToSync($this->model, $document[$this->primaryKey], 'update'); + (new IndexHandler($this->storeConfiguration))->resetIndex($current, $documentJSON); } } } @@ -599,6 +601,8 @@ public function update(array $data): array if ($this->ff->mode === 'hybrid') { $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + if ($this->indexing) { + (new IndexHandler($this->storeConfiguration))->resetIndex($current, $data); } $this->data = $data; @@ -651,6 +655,8 @@ function($content) use ($filePath, $data) { if ($this->ff->mode === 'hybrid') { $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + if ($this->indexing) { + (new IndexHandler($this->storeConfiguration))->resetIndex($current, $data); } $this->data = $data; @@ -686,6 +692,10 @@ public function deleteById($id, $deleteRelated = true, $relationsConditions = fa if ($this->ff->mode === 'hybrid') { $this->ff->addToSync($this->model, (int) $id, 'remove'); + $content = $this->findById($id); + + if ($this->indexing) { + (new IndexHandler($this->storeConfiguration))->removeFromIndex($content); } return (!file_exists($this->getDataPath() . "$id.json") || true === @unlink($this->getDataPath() . "$id.json")); @@ -1194,20 +1204,12 @@ protected function setConfigurationAndSchema(array $configuration = [], array $s $this->storeSchema = json_encode($schema); } - if (array_key_exists("indexing", $configuration)) { - if (!is_bool($configuration["indexing"])) { - throw new InvalidConfigurationException("indexing has to be boolean"); + if (array_key_exists("min_index_chars", $configuration)) { + if (!is_int($configuration["min_index_chars"])) { + throw new InvalidConfigurationException("min_index_chars has to be an integer"); } - $this->indexing = $configuration["indexing"]; - } - - if (array_key_exists("minIndexChars", $configuration)) { - if (!is_int($configuration["minIndexChars"])) { - throw new InvalidConfigurationException("minIndexChars has to be an integer"); - } - - $this->minIndexChars = $configuration["minIndexChars"]; + $this->minIndexChars = $configuration["min_index_chars"]; } if (array_key_exists("multiWords", $configuration)) { @@ -1237,6 +1239,18 @@ protected function setConfigurationAndSchema(array $configuration = [], array $s } $this->indexes = $configuration["indexes"]; + + if (count($configuration["indexes"]) > 0) { + $configuration['indexing'] = true; + } + } + + if (array_key_exists("indexing", $configuration)) { + if (!is_bool($configuration["indexing"])) { + throw new InvalidConfigurationException("indexing has to be boolean"); + } + + $this->indexing = $configuration["indexing"]; } if (array_key_exists("auto_cache", $configuration)) { @@ -1392,6 +1406,10 @@ protected function writeNewDocumentToStore(array $storeData): array throw $e; } + if ($this->indexing) { + (new IndexHandler($this->storeConfiguration))->setIndex($storeData); + } + return $storeData; } From eea957f461765aa4f791694e072833cc666ea3cd Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 05:14:44 +1100 Subject: [PATCH 13/20] issue #393, disable sync for the time being. We need to troubleshoot this as its filling up the jobs db. --- .../DatabaseServiceProvider/Ff/Store.php | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php index 28e78c7cf..fc13b422e 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php @@ -382,9 +382,9 @@ public function insert(array $data): array $data = $this->writeNewDocumentToStore($data); - if ($this->ff->mode === 'hybrid') { - $this->ff->addToSync($this->model, $data[$this->primaryKey]); - } + // if ($this->ff->mode === 'hybrid') { + // $this->ff->addToSync($this->model, $data[$this->primaryKey]); + // } $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); @@ -403,9 +403,9 @@ public function insertMany(array $data): array foreach ($data as $document) { $result = $this->writeNewDocumentToStore($document); - if ($this->ff->mode === 'hybrid') { - $this->ff->addToSync($this->model, $result[$this->primaryKey]); - } + // if ($this->ff->mode === 'hybrid') { + // $this->ff->addToSync($this->model, $result[$this->primaryKey]); + // } $results[] = $result; } @@ -470,7 +470,14 @@ public function updateOrInsert(array $data, bool $autoGenerateIdOnInsert = true) $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); - if ($this->ff->mode === 'hybrid') { + // if ($this->ff->mode === 'hybrid') { + // if ($insert) { + // $this->ff->addToSync($this->model, $data[$this->primaryKey]); + // } else { + // $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + // } + // } + if ($this->indexing) { if ($insert) { (new IndexHandler($this->storeConfiguration))->setIndex($dataJSON); @@ -541,7 +548,14 @@ public function updateOrInsertMany(array $data, bool $autoGenerateIdOnInsert = t throw $e; } - if ($this->ff->mode === 'hybrid') { + // if ($this->ff->mode === 'hybrid') { + // if ($insert) { + // $this->ff->addToSync($this->model, $document[$this->primaryKey]); + // } else { + // $this->ff->addToSync($this->model, $document[$this->primaryKey], 'update'); + // } + // } + // if ($this->indexing) { if ($insert) { (new IndexHandler($this->storeConfiguration))->setIndex($documentJSON); @@ -599,8 +613,9 @@ public function update(array $data): array $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); - if ($this->ff->mode === 'hybrid') { - $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + // if ($this->ff->mode === 'hybrid') { + // $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + // } if ($this->indexing) { (new IndexHandler($this->storeConfiguration))->resetIndex($current, $data); } @@ -653,8 +668,9 @@ function($content) use ($filePath, $data) { $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); - if ($this->ff->mode === 'hybrid') { - $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + // if ($this->ff->mode === 'hybrid') { + // $this->ff->addToSync($this->model, $data[$this->primaryKey], 'update'); + // } if ($this->indexing) { (new IndexHandler($this->storeConfiguration))->resetIndex($current, $data); } @@ -690,13 +706,14 @@ public function deleteById($id, $deleteRelated = true, $relationsConditions = fa } else { $this->createQueryBuilder()->getQuery()->getCache()->deleteAllWithNoLifetime(); - if ($this->ff->mode === 'hybrid') { - $this->ff->addToSync($this->model, (int) $id, 'remove'); $content = $this->findById($id); if ($this->indexing) { (new IndexHandler($this->storeConfiguration))->removeFromIndex($content); } + // if ($this->ff->mode === 'hybrid') { + // $this->ff->addToSync($this->model, (int) $id, 'remove'); + // } return (!file_exists($this->getDataPath() . "$id.json") || true === @unlink($this->getDataPath() . "$id.json")); } From 6a4f375eacecb742b516acb78cee81cadac36503 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 05:19:23 +1100 Subject: [PATCH 14/20] update issue #618, added package dependencies for packages. --- apps/Core/Components/Devtools/Modules/ModulesComponent.php | 1 - apps/Core/Packages/Devtools/Modules/DevtoolsModules.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/Core/Components/Devtools/Modules/ModulesComponent.php b/apps/Core/Components/Devtools/Modules/ModulesComponent.php index 4a083004d..bf28933ee 100644 --- a/apps/Core/Components/Devtools/Modules/ModulesComponent.php +++ b/apps/Core/Components/Devtools/Modules/ModulesComponent.php @@ -159,7 +159,6 @@ public function viewAction() } } } else if ($this->getData()['type'] === 'packages') { - unset($modules['packages']); unset($modules['views']); unset($modules['bundles']); $this->view->packageSettingsModules = $modules; diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index 2a5b89128..d76b16deb 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -920,6 +920,7 @@ public function getDefaultDependencies($type, $isSubView = false) $defaultDependencies['views'] = []; $defaultDependencies['externals'] = $externalDependencies; } else if ($type === 'packages') { + $defaultDependencies['packages'] = []; $defaultDependencies['middlewares'] = []; $defaultDependencies['externals'] = $externalDependencies; } else if ($type === 'middlewares') { From 2bb87b82589d0e24e23be05e219348267930479b Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 05:24:54 +1100 Subject: [PATCH 15/20] fix issue #625 --- .../Base/Providers/DatabaseServiceProvider/Ff/Store.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php index fc13b422e..fb4a7643e 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Store.php @@ -263,7 +263,9 @@ public function deleteStore(): bool public function getLastInsertedId(): int { if (!file_exists($this->storePath . '_cnt.sdb')) { - throw new IOException("File " . $this->storePath . '_cnt.sdb' . " does not exist."); + IoHelper::writeContentToFile($this->storePath . '_cnt.sdb', '{"totalEntries":0,"lastId":0}'); + + $this->count(true); } $counters = IoHelper::getFileContent($this->storePath . '_cnt.sdb'); @@ -1666,7 +1668,9 @@ protected function registerNewValidatorFormats($formats) protected function increaseCounterAndGetNextId(): int { if (!file_exists($this->storePath . '_cnt.sdb')) { - throw new IOException("File " . $this->storePath . '_cnt.sdb' . " does not exist."); + IoHelper::writeContentToFile($this->storePath . '_cnt.sdb', '{"totalEntries":0,"lastId":0}'); + + $this->count(true); } $dataPath = $this->getDataPath(); From d9580f8d1a5a0c552be48a0da091f926a5c5c6d7 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 05:27:26 +1100 Subject: [PATCH 16/20] Update issue #484. Fixed some minor bugs with APIs. --- .../Devtools/Migrator/DevtoolsMigrator.php | 2 +- .../Devtools/Modules/DevtoolsModules.php | 2 +- .../Packages/ApiClientServices/Apis.php | 22 +++++++++++++------ .../ModulesServiceProvider/Manager.php | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php b/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php index a2df6f548..8a2e1bd24 100644 --- a/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php +++ b/apps/Core/Packages/Devtools/Migrator/DevtoolsMigrator.php @@ -693,7 +693,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } if (isset($apis) && $returnApis) { - return $apis; + return $apis ?? []; } return $apisArr; diff --git a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php index d76b16deb..767af93b7 100644 --- a/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php +++ b/apps/Core/Packages/Devtools/Modules/DevtoolsModules.php @@ -3451,7 +3451,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } if ($returnApis) { - return $apis; + return $apis ?? []; } return $apisArr; diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/Apis.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/Apis.php index 0d655d14a..3700c6b1e 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/Apis.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/ApiClientServices/Apis.php @@ -62,7 +62,7 @@ public function init($apiConfig = null, $apiClientServices = null, $httpOptions "System\\Base\\Providers\\BasepackagesServiceProvider\\Packages\\ApiClientServices\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Api\\"; } else { $this->serviceClass = - "Apps\\{$this->apiConfig['location']}\\Packages\\System\\ApiClientServices\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Api\\"; + "Apps\\{$this->apiConfig['location']}\\Packages\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Api\\"; } return $this; @@ -94,7 +94,7 @@ protected function setConfiguration() if ($this->apiConfig['location'] === 'Basepackages') { $configurationClass = "System\\Base\\Providers\\BasepackagesServiceProvider\\Packages\\ApiClientServices\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Configuration"; } else { - $configurationClass = "Apps\\{$this->apiConfig['location']}\\Packages\\System\\ApiClientServices\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Configuration"; + $configurationClass = "Apps\\{$this->apiConfig['location']}\\Packages\\Apis\\{$this->apiConfig['category']}\\{$this->apiConfig['provider']}\\Configuration"; } $this->config = new $configurationClass; @@ -156,16 +156,24 @@ public function getResponse($toArray = false, $toJson = false) return false; } - public function toArray() + public function toArray($array = null) { $responseArr = []; - if ($this->response && is_array($this->response)) { - foreach ($this->response as $key => $response) { - $responseArr[$key] = ($response !== null) ? $this->helper->decode($response->__toString(), true) : null; + if (!$array) { + $array = $this->response; + } + + if ($array && is_array($array)) { + foreach ($array as $key => $response) { + if (is_array($response)) { + $responseArr[$key] = $this->toArray($response); + } else { + $responseArr[$key] = ($response !== null) ? $this->helper->decode($response->__toString(), true) : null; + } } } else { - $responseArr = $this->helper->decode($this->response->__toString(), true); + $responseArr = $this->helper->decode($array->__toString(), true); } return $responseArr; diff --git a/system/Base/Providers/ModulesServiceProvider/Manager.php b/system/Base/Providers/ModulesServiceProvider/Manager.php index bfa2953d9..9629a0d68 100644 --- a/system/Base/Providers/ModulesServiceProvider/Manager.php +++ b/system/Base/Providers/ModulesServiceProvider/Manager.php @@ -1202,7 +1202,7 @@ public function getAvailableApis($getAll = false, $returnApis = true) } if ($returnApis) { - return $apis; + return $apis ?? []; } return $apisArr; From d7b6ce0927c71ad3d479f228f5070c02a0fd19ea Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 06:04:29 +1100 Subject: [PATCH 17/20] fix issue #626 --- .../Ff/Classes/DocumentFinder.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php index f8d2bd5dd..99f8b751e 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php @@ -64,9 +64,9 @@ public function findDocuments(bool $getOneDocument, bool $reduceAndJoinPossible) if (count($conditions) > 0) { foreach ($conditions as $condition) { if (isset($condition[0]) && - in_array($condition[0], $this->storeConfiguration['indexes']) + in_array($condition[0][0], $this->storeConfiguration['indexes']) ) { - $keyword = trim($condition[2], '%');//This needs to extend + $keyword = trim($condition[0][2], '%');//This needs to extend if (strlen($keyword) < $this->storeConfiguration['min_index_chars']) { continue; @@ -76,7 +76,7 @@ public function findDocuments(bool $getOneDocument, bool $reduceAndJoinPossible) try { $indexFile = - IoHelper::getFileContent($this->storeConfiguration['indexesPath'] . $condition[0] . '/' . $indexChars . '.json'); + IoHelper::getFileContent($this->storeConfiguration['indexesPath'] . $condition[0][0] . '/' . $indexChars . '.json'); $indexJson = json_decode($indexFile, true); @@ -84,14 +84,14 @@ public function findDocuments(bool $getOneDocument, bool $reduceAndJoinPossible) foreach ($indexJson as $key => $ids) { $key = strtolower($key); - if (strtolower($condition[1]) === 'like') { + if (strtolower($condition[0][1]) === 'like') { if (str_starts_with($key, strtolower($keyword))) { foreach ($ids as $id) { $found[] = $this->store->findById($id); } } - } else if ($condition[1] === '=' || - $condition[1] === '===' + } else if ($condition[0][1] === '=' || + $condition[0][1] === '===' ) { if ($key === strtolower($keyword)) { foreach ($ids as $id) { From 802b5ea525298ecc78a05ef1fb13ac02e48e4f8b Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 06:20:48 +1100 Subject: [PATCH 18/20] update #626 --- .../Ff/Classes/DocumentFinder.php | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php index 99f8b751e..1d9f44b42 100644 --- a/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php +++ b/system/Base/Providers/DatabaseServiceProvider/Ff/Classes/DocumentFinder.php @@ -75,27 +75,40 @@ public function findDocuments(bool $getOneDocument, bool $reduceAndJoinPossible) $indexChars = strtolower(substr($keyword, 0, $this->storeConfiguration['min_index_chars'])); try { - $indexFile = - IoHelper::getFileContent($this->storeConfiguration['indexesPath'] . $condition[0][0] . '/' . $indexChars . '.json'); + $indexFile = IoHelper::getFileContent( + $this->storeConfiguration['indexesPath'] . $condition[0][0] . '/' . $indexChars . '.json' + ); + + $indexFile = strtolower($indexFile); $indexJson = json_decode($indexFile, true); if (count($indexJson) > 0) { - foreach ($indexJson as $key => $ids) { - $key = strtolower($key); - - if (strtolower($condition[0][1]) === 'like') { - if (str_starts_with($key, strtolower($keyword))) { - foreach ($ids as $id) { - $found[] = $this->store->findById($id); - } + if (isset($indexJson[strtolower($keyword)])) { + if (count($indexJson[strtolower($keyword)]) === 1) { + $found[] = $this->store->findById($indexJson[strtolower($keyword)][0]); + } else { + foreach ($indexJson[strtolower($keyword)] as $id) { + $found[] = $this->store->findById($id); } - } else if ($condition[0][1] === '=' || - $condition[0][1] === '===' - ) { - if ($key === strtolower($keyword)) { - foreach ($ids as $id) { - $found[] = $this->store->findById($id); + } + } else { + foreach ($indexJson as $key => $ids) { + $key = strtolower($key); + + if (strtolower($condition[0][1]) === 'like') { + if (str_starts_with($key, strtolower($keyword))) { + foreach ($ids as $id) { + $found[] = $this->store->findById($id); + } + } + } else if ($condition[0][1] === '=' || + $condition[0][1] === '===' + ) { + if ($key === strtolower($keyword)) { + foreach ($ids as $id) { + $found[] = $this->store->findById($id); + } } } } From 10740a7d7512fe46ceb5e6e62f92120e054a1ee8 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 15:07:46 +1100 Subject: [PATCH 19/20] fix issue #627. Change the bytes passed to the method to abs. Added reset method to reset the counters. --- .../BasepackagesServiceProvider/Packages/Utils.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php index b415782c6..1919db4b4 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php @@ -569,10 +569,17 @@ public function getMicroTimer() return $this->microTimers; } + public function resetMicroTimer() + { + $this->microTimers = []; + $this->microtime = 0; + $this->memoryusage = 0; + } + protected function getMemUsage($bytes) { $unit=array('b','kb','mb','gb','tb','pb'); - return @round($bytes/pow(1024,($i=floor(log($bytes,1024)))),2).' '.$unit[$i]; + return @round($bytes/pow(1024,($i=floor(log(abs($bytes),1024)))),2).' '.$unit[$i]; } } \ No newline at end of file From 21caf5c28c11ce21c992e8b50106584b103f29d7 Mon Sep 17 00:00:00 2001 From: "Gurdeep Singh (Guru)" Date: Sun, 23 Feb 2025 17:55:21 +1100 Subject: [PATCH 20/20] update issue #620 --- .../default/js/footer/core/Baz/BazProgress.js | 37 +++++++++-- public/core/default/js/footer/jsFooterCore.js | 37 +++++++++-- .../Packages/Progress.php | 61 +++++++++++++------ .../Packages/Utils.php | 3 +- 4 files changed, 107 insertions(+), 31 deletions(-) diff --git a/public/core/default/js/footer/core/Baz/BazProgress.js b/public/core/default/js/footer/core/Baz/BazProgress.js index d1f93f53a..5b1479cd4 100644 --- a/public/core/default/js/footer/core/Baz/BazProgress.js +++ b/public/core/default/js/footer/core/Baz/BazProgress.js @@ -28,8 +28,11 @@ var BazProgress = function() { var downloadedBytes = 0; var uploadTotal = 0; var uploadedBytes = 0; + var stepsTotal = 0; + var stepsCurrent = 0; var isUpload = false; var isDownload = false; + var isSteps = false; // Error // function error(errorMsg) { // throw new Error(errorMsg); @@ -186,8 +189,10 @@ var BazProgress = function() { $('.child-progress-span').attr('hidden', false); if (responseData['runners']['running'] && - responseData['runners']['running']['remoteWeb'] && - responseData['runners']['running']['remoteWebCounters'] + (responseData['runners']['running']['remoteWeb'] && + responseData['runners']['running']['remoteWebCounters']) || + (responseData['runners']['running']['steps'] && + responseData['runners']['running']['stepsCounters']) ) { $('#' + $(element)[0].id + ' .progress-remote').attr('hidden', false); $('.remote-progress-span').attr('hidden', false); @@ -214,10 +219,14 @@ var BazProgress = function() { switchProgressBarColor('.' + $(element)[0].id + '-child-bar', 'info'); if (responseData['runners']['running'] && - responseData['runners']['running']['remoteWeb'] && - responseData['runners']['running']['remoteWebCounters'] + (responseData['runners']['running']['remoteWeb'] && + responseData['runners']['running']['remoteWebCounters']) || + (responseData['runners']['running']['steps'] && + responseData['runners']['running']['stepsCounters']) ) { - if (responseData['runners']['running']['remoteWebCounters']) { + if (responseData['runners']['running']['remoteWebCounters'] || + responseData['runners']['running']['stepsCounters'] + ) { $('#' + $(element)[0].id + ' .progress-remote').attr('hidden', false); $('.remote-progress-span').attr('hidden', false); @@ -291,8 +300,11 @@ var BazProgress = function() { downloadedBytes = 0; uploadTotal = 0; uploadedBytes = 0; + stepsTotal = 0; + stepsCurrent = 0; isUpload = false; isDownload = false; + isSteps = false; $('.' + $(element)[0].id + '-child-bar').css('width', '0%'); $('.' + $(element)[0].id + '-child-bar').attr('aria-valuenow', 0); switchProgressBarColor('.' + $(element)[0].id + '-child-bar', 'info'); @@ -350,13 +362,23 @@ var BazProgress = function() { uploadTotal = responseData['runners']['running']['remoteWebCounters']['uploadTotal']; uploadedBytes = responseData['runners']['running']['remoteWebCounters']['uploadedBytes']; } + } else if (responseData['runners']['running']['stepsCounters']) { + if (responseData['runners']['running']['stepsCounters']['stepsTotal'] && + responseData['runners']['running']['stepsCounters']['stepsTotal'] > 0 + ) { + isSteps = true; + stepsTotal = responseData['runners']['running']['stepsCounters']['stepsTotal']; + stepsCurrent = responseData['runners']['running']['stepsCounters']['stepsCurrent']; + } } - if (isDownload || isUpload) { + if (isDownload || isUpload || isSteps) { if (isDownload) { text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + downloadedBytes + '/' + downloadTotal + ' bytes)'; } else if (isUpload) { text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + uploadedBytes + '/' + uploadTotal + ' bytes)'; + } else if (isSteps) { + text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + stepsCurrent + '/' + stepsTotal + ' steps)'; } } @@ -383,8 +405,11 @@ var BazProgress = function() { downloadedBytes = 0; uploadTotal = 0; uploadedBytes = 0; + stepsTotal = 0; + stepsCurrent = 0; isUpload = false; isDownload = false; + isSteps = false; $('body').trigger({'type':'bazProgressComplete', 'reset' : true}); } diff --git a/public/core/default/js/footer/jsFooterCore.js b/public/core/default/js/footer/jsFooterCore.js index 4c1205d09..59e736cb4 100644 --- a/public/core/default/js/footer/jsFooterCore.js +++ b/public/core/default/js/footer/jsFooterCore.js @@ -11855,8 +11855,11 @@ var BazProgress = function() { var downloadedBytes = 0; var uploadTotal = 0; var uploadedBytes = 0; + var stepsTotal = 0; + var stepsCurrent = 0; var isUpload = false; var isDownload = false; + var isSteps = false; // Error // function error(errorMsg) { // throw new Error(errorMsg); @@ -12013,8 +12016,10 @@ var BazProgress = function() { $('.child-progress-span').attr('hidden', false); if (responseData['runners']['running'] && - responseData['runners']['running']['remoteWeb'] && - responseData['runners']['running']['remoteWebCounters'] + (responseData['runners']['running']['remoteWeb'] && + responseData['runners']['running']['remoteWebCounters']) || + (responseData['runners']['running']['steps'] && + responseData['runners']['running']['stepsCounters']) ) { $('#' + $(element)[0].id + ' .progress-remote').attr('hidden', false); $('.remote-progress-span').attr('hidden', false); @@ -12041,10 +12046,14 @@ var BazProgress = function() { switchProgressBarColor('.' + $(element)[0].id + '-child-bar', 'info'); if (responseData['runners']['running'] && - responseData['runners']['running']['remoteWeb'] && - responseData['runners']['running']['remoteWebCounters'] + (responseData['runners']['running']['remoteWeb'] && + responseData['runners']['running']['remoteWebCounters']) || + (responseData['runners']['running']['steps'] && + responseData['runners']['running']['stepsCounters']) ) { - if (responseData['runners']['running']['remoteWebCounters']) { + if (responseData['runners']['running']['remoteWebCounters'] || + responseData['runners']['running']['stepsCounters'] + ) { $('#' + $(element)[0].id + ' .progress-remote').attr('hidden', false); $('.remote-progress-span').attr('hidden', false); @@ -12118,8 +12127,11 @@ var BazProgress = function() { downloadedBytes = 0; uploadTotal = 0; uploadedBytes = 0; + stepsTotal = 0; + stepsCurrent = 0; isUpload = false; isDownload = false; + isSteps = false; $('.' + $(element)[0].id + '-child-bar').css('width', '0%'); $('.' + $(element)[0].id + '-child-bar').attr('aria-valuenow', 0); switchProgressBarColor('.' + $(element)[0].id + '-child-bar', 'info'); @@ -12177,13 +12189,23 @@ var BazProgress = function() { uploadTotal = responseData['runners']['running']['remoteWebCounters']['uploadTotal']; uploadedBytes = responseData['runners']['running']['remoteWebCounters']['uploadedBytes']; } + } else if (responseData['runners']['running']['stepsCounters']) { + if (responseData['runners']['running']['stepsCounters']['stepsTotal'] && + responseData['runners']['running']['stepsCounters']['stepsTotal'] > 0 + ) { + isSteps = true; + stepsTotal = responseData['runners']['running']['stepsCounters']['stepsTotal']; + stepsCurrent = responseData['runners']['running']['stepsCounters']['stepsCurrent']; + } } - if (isDownload || isUpload) { + if (isDownload || isUpload || isSteps) { if (isDownload) { text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + downloadedBytes + '/' + downloadTotal + ' bytes)'; } else if (isUpload) { text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + uploadedBytes + '/' + uploadTotal + ' bytes)'; + } else if (isSteps) { + text = responseData['runners']['running']['text'] + ' (' + responseData['percentComplete'] + '% | ' + stepsCurrent + '/' + stepsTotal + ' steps)'; } } @@ -12210,8 +12232,11 @@ var BazProgress = function() { downloadedBytes = 0; uploadTotal = 0; uploadedBytes = 0; + stepsTotal = 0; + stepsCurrent = 0; isUpload = false; isDownload = false; + isSteps = false; $('body').trigger({'type':'bazProgressComplete', 'reset' : true}); } diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/Progress.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/Progress.php index ba2c8dda4..d2eeb6703 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/Progress.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/Progress.php @@ -15,7 +15,7 @@ class Progress extends BasePackage protected $progressFileName; - protected $remoteWebCountersTimer; + protected $countersTimer; public function init($container = null, $fileName = null) { @@ -161,7 +161,7 @@ public function getCallResult($method) } } - public function updateProgress($method, $callResult = null, $deleteFile = true, $child = null, array $remoteWebCounters = null) + public function updateProgress($method, $callResult = null, $deleteFile = true, $child = null, array $counters = null, $text = null) { if (!$this->progressFileName) { $this->progressFileName = $this->session->getId(); @@ -185,11 +185,16 @@ public function updateProgress($method, $callResult = null, $deleteFile = true, $runners['remainingChilds'] = count($progressFile['processes'][$progressFileKey]['childs']); $currentProcess = current($progressFileMethod['childs']); - if (isset($currentProcess['remoteWeb']) && $currentProcess['remoteWeb'] === true && $remoteWebCounters) { - $currentProcess = array_merge($currentProcess, ['remoteWebCounters' => $remoteWebCounters]); + if (isset($currentProcess['remoteWeb']) && $currentProcess['remoteWeb'] === true && $counters) { + $currentProcess = array_merge($currentProcess, ['remoteWebCounters' => $counters]); + } else if (isset($currentProcess['steps']) && $currentProcess['steps'] === true && $counters) { + $currentProcess = array_merge($currentProcess, ['stepsCounters' => $counters]); } $runners['running'] = $currentProcess; + if ($text) { + $runners['running']['text'] = $text; + } $runners['next'] = next($progressFileMethod['childs']); break; @@ -206,11 +211,16 @@ public function updateProgress($method, $callResult = null, $deleteFile = true, $currentProcess = current($progressFile['processes']); - if (isset($currentProcess['remoteWeb']) && $currentProcess['remoteWeb'] === true && $remoteWebCounters) { - $currentProcess = array_merge($currentProcess, ['remoteWebCounters' => $remoteWebCounters]); + if (isset($currentProcess['remoteWeb']) && $currentProcess['remoteWeb'] === true && $counters) { + $currentProcess = array_merge($currentProcess, ['remoteWebCounters' => $counters]); + } else if (isset($currentProcess['steps']) && $currentProcess['steps'] === true && $counters) { + $currentProcess = array_merge($currentProcess, ['stepsCounters' => $counters]); } $runners['running'] = $currentProcess; + if ($text) { + $runners['running']['text'] = $text; + } $runners['next'] = next($progressFile['processes']); } @@ -228,10 +238,10 @@ public function updateProgress($method, $callResult = null, $deleteFile = true, $callResult = true; } - $this->writeProgressFile($progressFile['processes'], false, false, true, $runners, null, $method, $callResult, $child, $remoteWebCounters); + $this->writeProgressFile($progressFile['processes'], false, false, true, $runners, null, $method, $callResult, $child, $counters); if ($callResult === true) { - $this->sendNotification($callResult, $remoteWebCounters); + $this->sendNotification($callResult, $counters); } return true; @@ -253,18 +263,21 @@ protected function checkNotificationTunnel() } } - protected function sendNotification($callResult, $remoteWebCounters = null) + protected function sendNotification($callResult, $counters = null) { - if ($remoteWebCounters && - $remoteWebCounters['downloadTotal'] !== $remoteWebCounters['downloadedBytes'] + if ($counters && + (isset($counters['downloadTotal']) && ($counters['downloadTotal'] !== $counters['downloadedBytes']) || + isset($counters['uploadTotal']) && ($counters['uploadTotal'] !== $counters['uploadedBytes']) || + isset($counters['stepsTotal']) && ($counters['stepsTotal'] !== $counters['stepsCurrent']) + ) ) {//only for remoteWebCounters - if (!$this->remoteWebCountersTimer) { - $this->remoteWebCountersTimer = time(); + if (!$this->countersTimer) { + $this->countersTimer = time(); } else { - if ((time() - $this->remoteWebCountersTimer) < 1) { + if ((time() - $this->countersTimer) < 1) { return false;//To minimize chatting on ws, we add a 1 second delay. } else { - $this->remoteWebCountersTimer = time(); + $this->countersTimer = time(); } } } @@ -312,6 +325,16 @@ protected function getPercentComplete($progressFile) if ($webProgress > -1) { $percentComplete = (float) number_format($webProgress); } + } else if (isset($progressFile['runners']['running']['stepsCounters'])) { + $stepsProgress = 0; + + if (isset($progressFile['runners']['running']['stepsCounters']['stepsTotal']) && $progressFile['runners']['running']['stepsCounters']['stepsTotal'] > 0) { + $stepsProgress = Percentage::calculate($progressFile['runners']['running']['stepsCounters']['stepsCurrent'], $progressFile['runners']['running']['stepsCounters']['stepsTotal']); + } + + if ($stepsProgress > -1) { + $percentComplete = (float) number_format($stepsProgress); + } } return $percentComplete; @@ -387,7 +410,7 @@ protected function writeProgressFile( $method = null, $callResult = null, $child = null, - array $remoteWebCounters = null + array $counters = null ) { if ($progressFile) { $file = $progressFile; @@ -440,8 +463,10 @@ protected function writeProgressFile( $allProcess['callExecTime'] = gettimeofday(true) - $allProcess['callExecTime']; } - if (isset($allProcess['remoteWeb']) && $allProcess['remoteWeb'] === true && $remoteWebCounters) { - $allProcess = array_merge($allProcess, $remoteWebCounters); + if (isset($allProcess['remoteWeb']) && $allProcess['remoteWeb'] === true && $counters) { + $allProcess = array_merge($allProcess, $counters); + } else if (isset($allProcess['steps']) && $allProcess['steps'] === true && $counters) { + $allProcess = array_merge($allProcess, $counters); } } } diff --git a/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php b/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php index 1919db4b4..328a46547 100644 --- a/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php +++ b/system/Base/Providers/BasepackagesServiceProvider/Packages/Utils.php @@ -548,6 +548,7 @@ public function setMicroTimer($reference, $calculateMemoryUsage = false) $now = microtime(true); $microtime['difference'] = $now - $this->microtime; $this->microtime = $now; + $microtime['formatted_difference'] = date("H:i:s", floor($microtime['difference'])); } if ($calculateMemoryUsage) { @@ -580,6 +581,6 @@ protected function getMemUsage($bytes) { $unit=array('b','kb','mb','gb','tb','pb'); - return @round($bytes/pow(1024,($i=floor(log(abs($bytes),1024)))),2).' '.$unit[$i]; + return @round(abs($bytes)/pow(1024,($i=floor(log(abs($bytes),1024)))),2).' '.$unit[$i]; } } \ No newline at end of file