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 @@
-
+