]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add API to change preferences 32560/head
authorJoas Schilling <coding@schilljs.com>
Mon, 23 May 2022 14:28:25 +0000 (16:28 +0200)
committerJoas Schilling <coding@schilljs.com>
Mon, 23 May 2022 14:44:23 +0000 (16:44 +0200)
Signed-off-by: Joas Schilling <coding@schilljs.com>
apps/provisioning_api/appinfo/routes.php
apps/provisioning_api/composer/composer/autoload_classmap.php
apps/provisioning_api/composer/composer/autoload_static.php
apps/provisioning_api/lib/Controller/PreferencesController.php [new file with mode: 0644]
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/public/Config/BeforePreferenceDeletedEvent.php [new file with mode: 0644]
lib/public/Config/BeforePreferenceSetEvent.php [new file with mode: 0644]

index 54d550260b8f7dd20e86471eaa9983d4266efe23..ab404ff84597d44e9142ff21e8373851b3356965 100644 (file)
@@ -73,6 +73,12 @@ return [
                ['name' => 'AppConfig#getValue', 'url' => '/api/v1/config/apps/{app}/{key}', 'verb' => 'GET'],
                ['name' => 'AppConfig#setValue', 'url' => '/api/v1/config/apps/{app}/{key}', 'verb' => 'POST'],
                ['name' => 'AppConfig#deleteKey', 'url' => '/api/v1/config/apps/{app}/{key}', 'verb' => 'DELETE'],
+
+               // Preferences
+               ['name' => 'Preferences#setPreference', 'url' => '/api/v1/config/users/{appId}/{configKey}', 'verb' => 'POST'],
+               ['name' => 'Preferences#setMultiplePreferences', 'url' => '/api/v1/config/users/{appId}', 'verb' => 'POST'],
+               ['name' => 'Preferences#deletePreference', 'url' => '/api/v1/config/users/{appId}/{configKey}', 'verb' => 'DELETE'],
+               ['name' => 'Preferences#deleteMultiplePreference', 'url' => '/api/v1/config/users/{appId}', 'verb' => 'DELETE'],
        ],
        'routes' => [
                // Verification
index 7f840d39729230d6498216b4140d9de390f92f87..12c2daf7a1406e10add7386086748651582eda23 100644 (file)
@@ -13,6 +13,7 @@ return array(
     'OCA\\Provisioning_API\\Controller\\AppConfigController' => $baseDir . '/../lib/Controller/AppConfigController.php',
     'OCA\\Provisioning_API\\Controller\\AppsController' => $baseDir . '/../lib/Controller/AppsController.php',
     'OCA\\Provisioning_API\\Controller\\GroupsController' => $baseDir . '/../lib/Controller/GroupsController.php',
+    'OCA\\Provisioning_API\\Controller\\PreferencesController' => $baseDir . '/../lib/Controller/PreferencesController.php',
     'OCA\\Provisioning_API\\Controller\\UsersController' => $baseDir . '/../lib/Controller/UsersController.php',
     'OCA\\Provisioning_API\\Controller\\VerificationController' => $baseDir . '/../lib/Controller/VerificationController.php',
     'OCA\\Provisioning_API\\FederatedShareProviderFactory' => $baseDir . '/../lib/FederatedShareProviderFactory.php',
index 6dbf6b45c79953aedff1ff57903c9ca8de043a80..5aadb1574b3550a0a9ef89b314a4175ab802503b 100644 (file)
@@ -28,6 +28,7 @@ class ComposerStaticInitProvisioning_API
         'OCA\\Provisioning_API\\Controller\\AppConfigController' => __DIR__ . '/..' . '/../lib/Controller/AppConfigController.php',
         'OCA\\Provisioning_API\\Controller\\AppsController' => __DIR__ . '/..' . '/../lib/Controller/AppsController.php',
         'OCA\\Provisioning_API\\Controller\\GroupsController' => __DIR__ . '/..' . '/../lib/Controller/GroupsController.php',
+        'OCA\\Provisioning_API\\Controller\\PreferencesController' => __DIR__ . '/..' . '/../lib/Controller/PreferencesController.php',
         'OCA\\Provisioning_API\\Controller\\UsersController' => __DIR__ . '/..' . '/../lib/Controller/UsersController.php',
         'OCA\\Provisioning_API\\Controller\\VerificationController' => __DIR__ . '/..' . '/../lib/Controller/VerificationController.php',
         'OCA\\Provisioning_API\\FederatedShareProviderFactory' => __DIR__ . '/..' . '/../lib/FederatedShareProviderFactory.php',
diff --git a/apps/provisioning_api/lib/Controller/PreferencesController.php b/apps/provisioning_api/lib/Controller/PreferencesController.php
new file mode 100644 (file)
index 0000000..2dba8b8
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Provisioning_API\Controller;
+
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCSController;
+use OCP\Config\BeforePreferenceDeletedEvent;
+use OCP\Config\BeforePreferenceSetEvent;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\IUserSession;
+
+class PreferencesController extends OCSController {
+
+       private IConfig $config;
+       private IUserSession $userSession;
+       private IEventDispatcher $eventDispatcher;
+
+       public function __construct(
+               string $appName,
+               IRequest $request,
+               IConfig $config,
+               IUserSession $userSession,
+               IEventDispatcher $eventDispatcher
+       ) {
+               parent::__construct($appName, $request);
+               $this->config = $config;
+               $this->userSession = $userSession;
+               $this->eventDispatcher = $eventDispatcher;
+       }
+
+       /**
+        * @NoAdminRequired
+        * @NoSubAdminRequired
+        */
+       public function setMultiplePreferences(string $appId, array $configs): DataResponse {
+               $userId = $this->userSession->getUser()->getUID();
+
+               foreach ($configs as $configKey => $configValue) {
+                       $event = new BeforePreferenceSetEvent(
+                               $userId,
+                               $appId,
+                               $configKey,
+                               $configValue
+                       );
+
+                       $this->eventDispatcher->dispatchTyped($event);
+
+                       if (!$event->isValid()) {
+                               // No listener validated that the preference can be set (to this value)
+                               return new DataResponse([], Http::STATUS_BAD_REQUEST);
+                       }
+               }
+
+               foreach ($configs as $configKey => $configValue) {
+                       $this->config->setUserValue(
+                               $userId,
+                               $appId,
+                               $configKey,
+                               $configValue
+                       );
+               }
+
+               return new DataResponse();
+       }
+
+       /**
+        * @NoAdminRequired
+        * @NoSubAdminRequired
+        */
+       public function setPreference(string $appId, string $configKey, string $configValue): DataResponse {
+               $userId = $this->userSession->getUser()->getUID();
+
+               $event = new BeforePreferenceSetEvent(
+                       $userId,
+                       $appId,
+                       $configKey,
+                       $configValue
+               );
+
+               $this->eventDispatcher->dispatchTyped($event);
+
+               if (!$event->isValid()) {
+                       // No listener validated that the preference can be set (to this value)
+                       return new DataResponse([], Http::STATUS_BAD_REQUEST);
+               }
+
+               $this->config->setUserValue(
+                       $userId,
+                       $appId,
+                       $configKey,
+                       $configValue
+               );
+
+               return new DataResponse();
+       }
+
+       /**
+        * @NoAdminRequired
+        * @NoSubAdminRequired
+        */
+       public function deleteMultiplePreference(string $appId, array $configKeys): DataResponse {
+               $userId = $this->userSession->getUser()->getUID();
+
+               foreach ($configKeys as $configKey) {
+                       $event = new BeforePreferenceDeletedEvent(
+                               $userId,
+                               $appId,
+                               $configKey
+                       );
+
+                       $this->eventDispatcher->dispatchTyped($event);
+
+                       if (!$event->isValid()) {
+                               // No listener validated that the preference can be deleted
+                               return new DataResponse([], Http::STATUS_BAD_REQUEST);
+                       }
+               }
+
+               foreach ($configKeys as $configKey) {
+                       $this->config->deleteUserValue(
+                               $userId,
+                               $appId,
+                               $configKey
+                       );
+               }
+
+               return new DataResponse();
+       }
+
+       /**
+        * @NoAdminRequired
+        * @NoSubAdminRequired
+        */
+       public function deletePreference(string $appId, string $configKey): DataResponse {
+               $userId = $this->userSession->getUser()->getUID();
+
+               $event = new BeforePreferenceDeletedEvent(
+                       $userId,
+                       $appId,
+                       $configKey
+               );
+
+               $this->eventDispatcher->dispatchTyped($event);
+
+               if (!$event->isValid()) {
+                       // No listener validated that the preference can be deleted
+                       return new DataResponse([], Http::STATUS_BAD_REQUEST);
+               }
+
+               $this->config->deleteUserValue(
+                       $userId,
+                       $appId,
+                       $configKey
+               );
+
+               return new DataResponse();
+       }
+}
index 520d2097918b88288501c88b2b138327a8a27b4d..d4e2cbe7c8ecf29234dc69ea7ea03b73882a4864 100644 (file)
@@ -160,6 +160,8 @@ return array(
     'OCP\\Comments\\IllegalIDChangeException' => $baseDir . '/lib/public/Comments/IllegalIDChangeException.php',
     'OCP\\Comments\\MessageTooLongException' => $baseDir . '/lib/public/Comments/MessageTooLongException.php',
     'OCP\\Comments\\NotFoundException' => $baseDir . '/lib/public/Comments/NotFoundException.php',
+    'OCP\\Config\\BeforePreferenceDeletedEvent' => $baseDir . '/lib/public/Config/BeforePreferenceDeletedEvent.php',
+    'OCP\\Config\\BeforePreferenceSetEvent' => $baseDir . '/lib/public/Config/BeforePreferenceSetEvent.php',
     'OCP\\Console\\ConsoleEvent' => $baseDir . '/lib/public/Console/ConsoleEvent.php',
     'OCP\\Constants' => $baseDir . '/lib/public/Constants.php',
     'OCP\\Contacts\\ContactsMenu\\IAction' => $baseDir . '/lib/public/Contacts/ContactsMenu/IAction.php',
index 294969211ec24d40cb08528d28c59eb94eb81e43..d1997b2b78515ab4e15c30fd505939263f815939 100644 (file)
@@ -189,6 +189,8 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OCP\\Comments\\IllegalIDChangeException' => __DIR__ . '/../../..' . '/lib/public/Comments/IllegalIDChangeException.php',
         'OCP\\Comments\\MessageTooLongException' => __DIR__ . '/../../..' . '/lib/public/Comments/MessageTooLongException.php',
         'OCP\\Comments\\NotFoundException' => __DIR__ . '/../../..' . '/lib/public/Comments/NotFoundException.php',
+        'OCP\\Config\\BeforePreferenceDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceDeletedEvent.php',
+        'OCP\\Config\\BeforePreferenceSetEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceSetEvent.php',
         'OCP\\Console\\ConsoleEvent' => __DIR__ . '/../../..' . '/lib/public/Console/ConsoleEvent.php',
         'OCP\\Constants' => __DIR__ . '/../../..' . '/lib/public/Constants.php',
         'OCP\\Contacts\\ContactsMenu\\IAction' => __DIR__ . '/../../..' . '/lib/public/Contacts/ContactsMenu/IAction.php',
diff --git a/lib/public/Config/BeforePreferenceDeletedEvent.php b/lib/public/Config/BeforePreferenceDeletedEvent.php
new file mode 100644 (file)
index 0000000..a2d1dad
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Config;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * @since 25.0.0
+ */
+class BeforePreferenceDeletedEvent extends Event {
+       protected string $userId;
+       protected string $appId;
+       protected string $configKey;
+       protected bool $valid = false;
+
+       /**
+        * @since 25.0.0
+        */
+       public function __construct(string $userId, string $appId, string $configKey) {
+               parent::__construct();
+               $this->userId = $userId;
+               $this->appId = $appId;
+               $this->configKey = $configKey;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getUserId(): string {
+               return $this->userId;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getAppId(): string {
+               return $this->appId;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getConfigKey(): string {
+               return $this->configKey;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function isValid(): bool {
+               return $this->valid;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function setValid(bool $valid): void {
+               $this->valid = $valid;
+       }
+}
diff --git a/lib/public/Config/BeforePreferenceSetEvent.php b/lib/public/Config/BeforePreferenceSetEvent.php
new file mode 100644 (file)
index 0000000..3168140
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2022 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Config;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * @since 25.0.0
+ */
+class BeforePreferenceSetEvent extends Event {
+       protected string $userId;
+       protected string $appId;
+       protected string $configKey;
+       protected string $configValue;
+       protected bool $valid = false;
+
+       /**
+        * @since 25.0.0
+        */
+       public function __construct(string $userId, string $appId, string $configKey, string $configValue) {
+               parent::__construct();
+               $this->userId = $userId;
+               $this->appId = $appId;
+               $this->configKey = $configKey;
+               $this->configValue = $configValue;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getUserId(): string {
+               return $this->userId;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getAppId(): string {
+               return $this->appId;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getConfigKey(): string {
+               return $this->configKey;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function getConfigValue(): string {
+               return $this->configValue;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function isValid(): bool {
+               return $this->valid;
+       }
+
+       /**
+        * @since 25.0.0
+        */
+       public function setValid(bool $valid): void {
+               $this->valid = $valid;
+       }
+}