diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 96ccc5ed..0173a627 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -16,6 +16,7 @@ use OCA\AppAPI\Listener\DeclarativeSettings\SetValueListener; use OCA\AppAPI\Listener\FileEventsListener; use OCA\AppAPI\Listener\LoadFilesPluginListener; +use OCA\AppAPI\Listener\LoadMenuEntriesListener; use OCA\AppAPI\Listener\SabrePluginAuthInitListener; use OCA\AppAPI\Middleware\AppAPIAuthMiddleware; use OCA\AppAPI\Middleware\ExAppUIL10NMiddleware; @@ -23,7 +24,6 @@ use OCA\AppAPI\Notifications\ExAppNotifier; use OCA\AppAPI\PublicCapabilities; use OCA\AppAPI\Service\ProvidersAI\TaskProcessingService; -use OCA\AppAPI\Service\UI\TopMenuService; use OCA\AppAPI\SetupChecks\DaemonCheck; use OCA\DAV\Events\SabrePluginAuthInitEvent; use OCA\Files\Event\LoadAdditionalScriptsEvent; @@ -38,13 +38,13 @@ use OCP\Files\Events\Node\NodeRenamedEvent; use OCP\Files\Events\Node\NodeTouchedEvent; use OCP\Files\Events\Node\NodeWrittenEvent; +use OCP\Navigation\Events\LoadAdditionalEntriesEvent; use OCP\SabrePluginEvent; use OCP\Settings\Events\DeclarativeSettingsGetValueEvent; use OCP\Settings\Events\DeclarativeSettingsRegisterFormEvent; use OCP\Settings\Events\DeclarativeSettingsSetValueEvent; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use Throwable; class Application extends App implements IBootstrap { public const APP_ID = 'app_api'; @@ -61,6 +61,7 @@ public function __construct(array $urlParams = []) { * @psalm-suppress UndefinedClass */ public function register(IRegistrationContext $context): void { + $context->registerEventListener(LoadAdditionalEntriesEvent::class, LoadMenuEntriesListener::class); $context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadFilesPluginListener::class); $context->registerCapability(Capabilities::class); $context->registerCapability(PublicCapabilities::class); @@ -93,10 +94,6 @@ public function register(IRegistrationContext $context): void { } public function boot(IBootContext $context): void { - try { - $context->injectFn($this->registerExAppsMenuEntries(...)); - } catch (NotFoundExceptionInterface|ContainerExceptionInterface|Throwable) { - } } public function registerDavAuth(): void { @@ -107,10 +104,4 @@ public function registerDavAuth(): void { $event->getServer()->addPlugin($container->query(DavPlugin::class)); }); } - - private function registerExAppsMenuEntries(): void { - $container = $this->getContainer(); - $menuEntryService = $container->get(TopMenuService::class); - $menuEntryService->registerMenuEntries($container); - } } diff --git a/lib/Listener/LoadMenuEntriesListener.php b/lib/Listener/LoadMenuEntriesListener.php new file mode 100644 index 00000000..b4567ada --- /dev/null +++ b/lib/Listener/LoadMenuEntriesListener.php @@ -0,0 +1,80 @@ + + */ +class LoadMenuEntriesListener implements IEventListener { + + public function __construct( + private readonly TopMenuService $topMenuService, + ) { + } + + public function handle(Event $event): void { + if (!$event instanceof LoadAdditionalEntriesEvent) { + return; + } + + $menuEntries = $this->topMenuService->getExAppMenuEntries(); + if (empty($menuEntries)) { + return; + } + + $user = Server::get(IUserSession::class)->getUser(); + if (!$user) { + return; + } + $isUserAdmin = Server::get(IGroupManager::class)->isAdmin($user->getUID()); + + /** @var INavigationManager $navigationManager */ + $navigationManager = Server::get(INavigationManager::class); + + foreach ($menuEntries as $menuEntry) { + if ($menuEntry->getAdminRequired() === 1 && !$isUserAdmin) { + continue; // Skip this entry if the user is not an admin and the entry requires admin privileges + } + $navigationManager->add(static function () use ($menuEntry) { + $appId = $menuEntry->getAppid(); + $entryName = $menuEntry->getName(); + $icon = $menuEntry->getIcon(); + $urlGenerator = Server::get(IURLGenerator::class); + return [ + 'id' => Application::APP_ID . '_' . $appId . '_' . $entryName, + 'type' => 'link', + 'app' => Application::APP_ID, + 'href' => $urlGenerator->linkToRoute( + 'app_api.TopMenu.viewExAppPage', ['appId' => $appId, 'name' => $entryName] + ), + 'icon' => $icon === '' ? + $urlGenerator->imagePath('app_api', 'app.svg') : + $urlGenerator->linkToRoute( + 'app_api.ExAppProxy.ExAppGet', ['appId' => $appId, 'other' => $icon] + ), + 'name' => Server::get(IFactory::class)->get($appId)->t($menuEntry->getDisplayName()), + ]; + }); + } + } +} diff --git a/lib/Service/UI/TopMenuService.php b/lib/Service/UI/TopMenuService.php index c9b0467a..6fe6c5b3 100644 --- a/lib/Service/UI/TopMenuService.php +++ b/lib/Service/UI/TopMenuService.php @@ -17,15 +17,6 @@ use OCP\DB\Exception; use OCP\ICache; use OCP\ICacheFactory; -use OCP\IGroupManager; -use OCP\INavigationManager; -use OCP\IURLGenerator; -use OCP\IUser; -use OCP\IUserSession; -use OCP\L10N\IFactory; -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\ContainerInterface; -use Psr\Container\NotFoundExceptionInterface; use Psr\Log\LoggerInterface; class TopMenuService { @@ -44,47 +35,6 @@ public function __construct( } } - /** - * @throws NotFoundExceptionInterface - * @throws ContainerExceptionInterface - * @throws Exception - */ - public function registerMenuEntries(ContainerInterface $container): void { - /** @var TopMenu $menuEntry */ - foreach ($this->getExAppMenuEntries() as $menuEntry) { - $userSession = $container->get(IUserSession::class); - /** @var IGroupManager $groupManager */ - $groupManager = $container->get(IGroupManager::class); - /** @var IUser $user */ - $user = $userSession->getUser(); - if ($menuEntry->getAdminRequired() === 1 && !$groupManager->isAdmin($user->getUID())) { - continue; // Skip this entry if user is not admin and entry requires admin privileges - } - $container->get(INavigationManager::class)->add(function () use ($container, $menuEntry) { - $urlGenerator = $container->get(IURLGenerator::class); - /** @var IFactory $l10nFactory */ - $l10nFactory = $container->get(IFactory::class); - $appId = $menuEntry->getAppid(); - $entryName = $menuEntry->getName(); - $icon = $menuEntry->getIcon(); - return [ - 'id' => Application::APP_ID . '_' . $appId . '_' . $entryName, - 'type' => 'link', - 'app' => Application::APP_ID, - 'href' => $urlGenerator->linkToRoute( - 'app_api.TopMenu.viewExAppPage', ['appId' => $appId, 'name' => $entryName] - ), - 'icon' => $icon === '' ? - $urlGenerator->imagePath('app_api', 'app.svg') : - $urlGenerator->linkToRoute( - 'app_api.ExAppProxy.ExAppGet', ['appId' => $appId, 'other' => $icon] - ), - 'name' => $l10nFactory->get($appId)->t($menuEntry->getDisplayName()), - ]; - }); - } - } - public function registerExAppMenuEntry(string $appId, string $name, string $displayName, string $icon, int $adminRequired): ?TopMenu { $menuEntry = $this->getExAppMenuEntry($appId, $name); diff --git a/tests/psalm-baseline.xml b/tests/psalm-baseline.xml index af4fd3e9..e47aaee1 100644 --- a/tests/psalm-baseline.xml +++ b/tests/psalm-baseline.xml @@ -7,6 +7,7 @@ + @@ -97,6 +98,23 @@ + + + + + + + + + + + + + + + + + @@ -123,9 +141,9 @@ - +