%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/FilesActionsMenuService.php |
<?php declare(strict_types=1); namespace OCA\AppAPI\Service\UI; use OCA\AppAPI\AppInfo\Application; use OCA\AppAPI\Db\UI\FilesActionsMenu; use OCA\AppAPI\Db\UI\FilesActionsMenuMapper; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\DB\Exception; use OCP\ICache; use OCP\ICacheFactory; use Psr\Log\LoggerInterface; class FilesActionsMenuService { private ?ICache $cache = null; public function __construct( ICacheFactory $cacheFactory, private readonly FilesActionsMenuMapper $mapper, private readonly LoggerInterface $logger, ) { if ($cacheFactory->isAvailable()) { $this->cache = $cacheFactory->createDistributed(Application::APP_ID . '/ex_ui_files_actions'); } } /** * Register file action menu from ExApp * * @param string $appId * @param string $name * @param string $displayName * @param string $actionHandler * @param string $icon * @param string $mime * @param int $permissions * @param int $order * @param string $version * @return FilesActionsMenu|null */ public function registerFileActionMenu(string $appId, string $name, string $displayName, string $actionHandler, string $icon, string $mime, int $permissions, int $order, string $version): ?FilesActionsMenu { try { $fileActionMenu = $this->mapper->findByAppidName($appId, $name); } catch (DoesNotExistException|MultipleObjectsReturnedException|Exception) { $fileActionMenu = null; } try { $newFileActionMenu = new FilesActionsMenu([ 'appid' => $appId, 'name' => $name, 'display_name' => $displayName, 'action_handler' => ltrim($actionHandler, '/'), 'icon' => ltrim($icon, '/'), 'mime' => $mime, 'permissions' => $permissions, 'order' => $order, 'version' => $version, ]); if ($fileActionMenu !== null) { $newFileActionMenu->setId($fileActionMenu->getId()); } $fileActionMenu = $this->mapper->insertOrUpdate($newFileActionMenu); $this->resetCacheEnabled(); } catch (Exception $e) { $this->logger->error( sprintf('Failed to register ExApp %s FileActionMenu %s. Error: %s', $appId, $name, $e->getMessage()), ['exception' => $e] ); return null; } return $fileActionMenu; } public function unregisterFileActionMenu(string $appId, string $name): ?FilesActionsMenu { try { $fileActionMenu = $this->getExAppFileAction($appId, $name); if ($fileActionMenu !== null) { $this->mapper->delete($fileActionMenu); $this->resetCacheEnabled(); return $fileActionMenu; } } catch (Exception $e) { $this->logger->error(sprintf('Failed to unregister ExApp %s FileActionMenu %s. Error: %s', $appId, $name, $e->getMessage()), ['exception' => $e]); } return null; } /** * Get list of registered file actions (only for enabled ExApps) * * @return FilesActionsMenu[] */ public function getRegisteredFileActions(): array { try { $cacheKey = '/ex_ui_files_actions'; $records = $this->cache?->get($cacheKey); if ($records === null) { $records = $this->mapper->findAllEnabled(); $this->cache?->set($cacheKey, $records); } return array_map(function ($record) { return new FilesActionsMenu($record); }, $records); } catch (Exception) { return []; } } public function getExAppFileAction(string $appId, string $fileActionName): ?FilesActionsMenu { foreach ($this->getRegisteredFileActions() as $fileAction) { if (($fileAction->getAppid() === $appId) && ($fileAction->getName() === $fileActionName)) { return $fileAction; } } try { return $this->mapper->findByAppIdName($appId, $fileActionName); } catch (DoesNotExistException|MultipleObjectsReturnedException|Exception) { return null; } } public function unregisterExAppFileActions(string $appId): int { try { $result = $this->mapper->removeAllByAppId($appId); } catch (Exception) { $result = -1; } $this->resetCacheEnabled(); return $result; } public function resetCacheEnabled(): void { $this->cache?->remove('/ex_ui_files_actions'); } }