%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps/app_api/lib/Service/UI/ |
| Current File : //www/varak.net/nextcloud.varak.net/apps/app_api/lib/Service/UI/TopMenuService.php |
<?php
declare(strict_types=1);
namespace OCA\AppAPI\Service\UI;
use OCA\AppAPI\AppInfo\Application;
use OCA\AppAPI\Db\UI\TopMenu;
use OCA\AppAPI\Db\UI\TopMenuMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
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 {
private ?ICache $cache = null;
public function __construct(
private readonly TopMenuMapper $mapper,
private readonly LoggerInterface $logger,
private readonly InitialStateService $initialStateService,
private readonly ScriptsService $scriptsService,
private readonly StylesService $stylesService,
ICacheFactory $cacheFactory,
) {
if ($cacheFactory->isAvailable()) {
$this->cache = $cacheFactory->createDistributed(Application::APP_ID . '/ex_top_menus');
}
}
/**
* @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);
try {
$newMenuEntry = new TopMenu([
'appid' => $appId,
'name' => $name,
'display_name' => $displayName,
'icon' => ltrim($icon, '/'),
'admin_required' => $adminRequired,
]);
if ($menuEntry !== null) {
$newMenuEntry->setId($menuEntry->getId());
}
$menuEntry = $this->mapper->insertOrUpdate($newMenuEntry);
$this->resetCacheEnabled();
} catch (Exception $e) {
$this->logger->error(
sprintf('Failed to register ExApp %s TopMenu %s. Error: %s', $appId, $name, $e->getMessage()), ['exception' => $e]
);
return null;
}
return $menuEntry;
}
public function unregisterExAppMenuEntry(string $appId, string $name): bool {
$result = $this->mapper->removeByAppIdName($appId, $name);
if (!$result) {
return false;
}
$this->resetCacheEnabled();
$this->initialStateService->deleteExAppInitialStatesByTypeName($appId, 'top_menu', $name);
$this->scriptsService->deleteExAppScriptsByTypeName($appId, 'top_menu', $name);
$this->stylesService->deleteExAppStylesByTypeName($appId, 'top_menu', $name);
return true;
}
public function unregisterExAppMenuEntries(string $appId): int {
try {
$result = $this->mapper->removeAllByAppId($appId);
} catch (Exception) {
$result = -1;
}
$this->resetCacheEnabled();
return $result;
}
public function getExAppMenuEntry(string $appId, string $name): ?TopMenu {
foreach ($this->getExAppMenuEntries() as $menuEntry) {
if (($menuEntry->getAppid() === $appId) && ($menuEntry->getName() === $name)) {
return $menuEntry;
}
}
try {
return $this->mapper->findByAppIdName($appId, $name);
} catch (DoesNotExistException|MultipleObjectsReturnedException|Exception) {
return null;
}
}
/**
* Get list of registered TopMenu entries (only for enabled ExApps)
*
* @return TopMenu[]
*/
public function getExAppMenuEntries(): array {
try {
$cacheKey = '/ex_top_menus';
$records = $this->cache?->get($cacheKey);
if ($records === null) {
$records = $this->mapper->findAllEnabled();
$this->cache?->set($cacheKey, $records);
}
return array_map(function ($record) {
return new TopMenu($record);
}, $records);
} catch (Exception) {
return [];
}
}
public function resetCacheEnabled(): void {
$this->cache?->remove('/ex_top_menus');
}
}