diff --git a/src/Core/Addon/AddonManagerHelper.php b/src/Core/Addon/AddonManagerHelper.php new file mode 100644 index 0000000000..1672be1de2 --- /dev/null +++ b/src/Core/Addon/AddonManagerHelper.php @@ -0,0 +1,160 @@ +addonPath = $addonPath; + $this->profiler = $profiler; + + $this->proxy = new AddonProxy($addonPath); + } + /** + * Returns the absolute path to the addon folder + * + * e.g. `/var/www/html/addon` + */ + public function getAddonPath(): string + { + return $this->addonPath; + } + + /** + * Returns the list of available addons. + * + * This list is made from scanning the addon/ folder. + * Unsupported addons are excluded unless they already are enabled or system.show_unsupported_addon is set. + * + * @return string[] + */ + public function getAvailableAddons(): array + { + return $this->proxy->getAvailableAddons(); + } + + /** + * Installs an addon. + * + * @param string $addonId name of the addon + * + * @return bool true on success or false on failure + */ + public function installAddon(string $addonId): bool + { + return $this->proxy->installAddon($addonId); + } + + /** + * Uninstalls an addon. + * + * @param string $addonId name of the addon + */ + public function uninstallAddon(string $addonId): void + { + $this->proxy->uninstallAddon($addonId); + } + + /** + * Load addons. + * + * @internal + */ + public function loadAddons(): void + { + $this->proxy->loadAddons(); + } + + /** + * Reload (uninstall and install) all updated addons. + */ + public function reloadAddons(): void + { + $this->proxy->reloadAddons(); + } + + /** + * Get the comment block of an addon as value object. + */ + public function getAddonInfo(string $addonId): AddonInfo + { + $default = [ + 'id' => $addonId, + 'name' => $addonId, + ]; + + if (!is_file($this->getAddonPath() . "/$addonId/$addonId.php")) { + return AddonInfo::fromArray($default); + } + + $this->profiler->startRecording('file'); + + $raw = file_get_contents($this->getAddonPath() . "/$addonId/$addonId.php"); + + $this->profiler->stopRecording(); + + return AddonInfo::fromString($addonId, $raw); + } + + /** + * Checks if the provided addon is enabled + */ + public function isAddonEnabled(string $addonId): bool + { + return $this->proxy->isAddonEnabled($addonId); + } + + /** + * Returns a list with the IDs of the enabled addons + * + * @return string[] + */ + public function getEnabledAddons(): array + { + return $this->proxy->getEnabledAddons(); + } + + /** + * Returns a list with the IDs of the non-hidden enabled addons + * + * @return string[] + */ + public function getVisibleEnabledAddons(): array + { + return $this->proxy->getVisibleEnabledAddons(); + } + + /** + * Returns a list with the IDs of the enabled addons that provides admin settings. + * + * @return string[] + */ + public function getEnabledAddonsWithAdminSettings(): array + { + return $this->proxy->getEnabledAddonsWithAdminSettings(); + } +} diff --git a/tests/Unit/Core/Addon/AddonManagerHelperTest.php b/tests/Unit/Core/Addon/AddonManagerHelperTest.php new file mode 100644 index 0000000000..9ee8bde3c8 --- /dev/null +++ b/tests/Unit/Core/Addon/AddonManagerHelperTest.php @@ -0,0 +1,32 @@ +createStub(Profiler::class) + ); + + $info = $addonManagerHelper->getAddonInfo('helloaddon'); + + $this->assertInstanceOf(AddonInfo::class, $info); + + $this->assertEquals('Hello Addon', $info->getName()); + } +} diff --git a/tests/Util/addons/helloaddon/helloaddon.php b/tests/Util/addons/helloaddon/helloaddon.php new file mode 100644 index 0000000000..679298dfde --- /dev/null +++ b/tests/Util/addons/helloaddon/helloaddon.php @@ -0,0 +1,29 @@ + + */ + +use Friendica\Core\Hook; + +function helloaddon_install() +{ + Hook::register('page_end', 'addon/helloaddon/helloaddon.php', 'helloaddon_page_end'); +} + +function helloaddon_uninstall() +{ + Hook::unregister('page_end', 'addon/helloaddon/helloaddon.php', 'helloaddon_page_end'); +} + +function helloaddon_page_end(&$html) +{ + $html .= '
Hello, World!
'; +}