%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/SettingsService.php |
<?php declare(strict_types=1); namespace OCA\AppAPI\Service\UI; use OCA\AppAPI\AppInfo\Application; use OCA\AppAPI\Db\UI\SettingsForm; use OCA\AppAPI\Db\UI\SettingsFormMapper; 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 SettingsService { private ?ICache $cache = null; public function __construct( ICacheFactory $cacheFactory, private readonly SettingsFormMapper $mapper, private readonly LoggerInterface $logger, ) { if ($cacheFactory->isAvailable()) { $this->cache = $cacheFactory->createDistributed(Application::APP_ID . '/ex_settings_forms'); } } public function registerForm( string $appId, array $formScheme, ): ?SettingsForm { $formId = $formScheme['id']; $formScheme['storage_type'] = 'external'; // DeclarativeSettingsTypes::STORAGE_TYPE_EXTERNAL; try { $settingsForm = $this->mapper->findByAppidFormId($appId, $formId); } catch (DoesNotExistException|MultipleObjectsReturnedException|Exception) { $settingsForm = null; } try { $newSettingsForm = new SettingsForm([ 'appid' => $appId, 'formid' => $formId, 'scheme' => $formScheme, ]); if ($settingsForm !== null) { $newSettingsForm->setId($settingsForm->getId()); } $settingsForm = $this->mapper->insertOrUpdate($newSettingsForm); $this->resetCacheEnabled(); } catch (Exception $e) { $this->logger->error( sprintf('Failed to register ExApp %s Settings Form %s. Error: %s', $appId, $formId, $e->getMessage()), ['exception' => $e] ); return null; } return $settingsForm; } public function unregisterForm(string $appId, string $formId): ?SettingsForm { try { $settingsForm = $this->getForm($appId, $formId); if ($settingsForm !== null) { $this->mapper->delete($settingsForm); $this->resetCacheEnabled(); return $settingsForm; } } catch (Exception $e) { $this->logger->error(sprintf('Failed to unregister ExApp %s Settings Form %s. Error: %s', $appId, $formId, $e->getMessage()), ['exception' => $e]); } return null; } /** * Get list of registered Settings Forms (only for enabled ExApps) * * @return SettingsForm[] */ public function getRegisteredForms(): array { try { $cacheKey = '/ex_settings_forms'; $records = $this->cache?->get($cacheKey); if ($records === null) { $records = $this->mapper->findAllEnabled(); $this->cache?->set($cacheKey, $records); } return array_map(function ($record) { return new SettingsForm($record); }, $records); } catch (Exception) { return []; } } public function getForm(string $appId, string $formId): ?SettingsForm { foreach ($this->getRegisteredForms() as $form) { if (($form->getAppid() === $appId) && ($form->getFormid() === $formId)) { return $form; } } try { return $this->mapper->findByAppidFormId($appId, $formId); } catch (DoesNotExistException|MultipleObjectsReturnedException|Exception) { return null; } } public function unregisterExAppForms(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_settings_forms'); } }