diff options
author | provokateurin <kate@provokateurin.de> | 2024-01-19 23:12:25 +0100 |
---|---|---|
committer | provokateurin <kate@provokateurin.de> | 2024-05-10 09:44:01 +0200 |
commit | fdd905ba42ae5a7a2770568ff1e6376722af5d1b (patch) | |
tree | a69e861f54f7415d0a0e7ca8d94f25b323b4830a /apps | |
parent | 5f53e446da58cbddc6d6a89736c3fe86edc4695c (diff) | |
download | nextcloud-server-fdd905ba42ae5a7a2770568ff1e6376722af5d1b.tar.gz nextcloud-server-fdd905ba42ae5a7a2770568ff1e6376722af5d1b.zip |
feat(dashboard): Add endpoints to get the layout and statuses
Signed-off-by: provokateurin <kate@provokateurin.de>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dashboard/appinfo/routes.php | 2 | ||||
-rw-r--r-- | apps/dashboard/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | apps/dashboard/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | apps/dashboard/lib/Controller/DashboardApiController.php | 26 | ||||
-rw-r--r-- | apps/dashboard/lib/Controller/DashboardController.php | 20 | ||||
-rw-r--r-- | apps/dashboard/lib/Service/DashboardService.php | 62 | ||||
-rw-r--r-- | apps/dashboard/openapi.json | 140 |
7 files changed, 237 insertions, 15 deletions
diff --git a/apps/dashboard/appinfo/routes.php b/apps/dashboard/appinfo/routes.php index 21c8ea7b2de..6fcc9209741 100644 --- a/apps/dashboard/appinfo/routes.php +++ b/apps/dashboard/appinfo/routes.php @@ -33,7 +33,9 @@ return [ ['name' => 'dashboardApi#getWidgets', 'url' => '/api/v1/widgets', 'verb' => 'GET'], ['name' => 'dashboardApi#getWidgetItems', 'url' => '/api/v1/widget-items', 'verb' => 'GET'], ['name' => 'dashboardApi#getWidgetItemsV2', 'url' => '/api/v2/widget-items', 'verb' => 'GET'], + ['name' => 'dashboardApi#getLayout', 'url' => '/api/v3/layout', 'verb' => 'GET'], ['name' => 'dashboardApi#updateLayout', 'url' => '/api/v3/layout', 'verb' => 'POST'], + ['name' => 'dashboardApi#getStatuses', 'url' => '/api/v3/statuses', 'verb' => 'GET'], ['name' => 'dashboardApi#updateStatuses', 'url' => '/api/v3/statuses', 'verb' => 'POST'], ] ]; diff --git a/apps/dashboard/composer/composer/autoload_classmap.php b/apps/dashboard/composer/composer/autoload_classmap.php index 0bf9a3f8d9b..4a8609daeb0 100644 --- a/apps/dashboard/composer/composer/autoload_classmap.php +++ b/apps/dashboard/composer/composer/autoload_classmap.php @@ -10,4 +10,5 @@ return array( 'OCA\\Dashboard\\Controller\\DashboardApiController' => $baseDir . '/../lib/Controller/DashboardApiController.php', 'OCA\\Dashboard\\Controller\\DashboardController' => $baseDir . '/../lib/Controller/DashboardController.php', 'OCA\\Dashboard\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php', + 'OCA\\Dashboard\\Service\\DashboardService' => $baseDir . '/../lib/Service/DashboardService.php', ); diff --git a/apps/dashboard/composer/composer/autoload_static.php b/apps/dashboard/composer/composer/autoload_static.php index fc0264a32c1..72f839d3315 100644 --- a/apps/dashboard/composer/composer/autoload_static.php +++ b/apps/dashboard/composer/composer/autoload_static.php @@ -25,6 +25,7 @@ class ComposerStaticInitDashboard 'OCA\\Dashboard\\Controller\\DashboardApiController' => __DIR__ . '/..' . '/../lib/Controller/DashboardApiController.php', 'OCA\\Dashboard\\Controller\\DashboardController' => __DIR__ . '/..' . '/../lib/Controller/DashboardController.php', 'OCA\\Dashboard\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php', + 'OCA\\Dashboard\\Service\\DashboardService' => __DIR__ . '/..' . '/../lib/Service/DashboardService.php', ); public static function getInitializer(ClassLoader $loader) diff --git a/apps/dashboard/lib/Controller/DashboardApiController.php b/apps/dashboard/lib/Controller/DashboardApiController.php index 65ec8235a7e..bd7cb402600 100644 --- a/apps/dashboard/lib/Controller/DashboardApiController.php +++ b/apps/dashboard/lib/Controller/DashboardApiController.php @@ -29,6 +29,7 @@ declare(strict_types=1); namespace OCA\Dashboard\Controller; use OCA\Dashboard\ResponseDefinitions; +use OCA\Dashboard\Service\DashboardService; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; @@ -60,6 +61,7 @@ class DashboardApiController extends OCSController { private IManager $dashboardManager, private IConfig $config, private ?string $userId, + private DashboardService $service, ) { parent::__construct($appName, $request); } @@ -191,6 +193,18 @@ class DashboardApiController extends OCSController { } /** + * Get the layout + * + * @NoAdminRequired + * @return DataResponse<Http::STATUS_OK, array{layout: list<string>}, array{}> + * + * 200: Layout returned + */ + public function getLayout(): DataResponse { + return new DataResponse(['layout' => $this->service->getLayout()]); + } + + /** * Update the layout * * @NoAdminRequired @@ -205,6 +219,18 @@ class DashboardApiController extends OCSController { } /** + * Get the statuses + * + * @NoAdminRequired + * @return DataResponse<Http::STATUS_OK, array{statuses: list<string>}, array{}> + * + * 200: Statuses returned + */ + public function getStatuses(): DataResponse { + return new DataResponse(['statuses' => $this->service->getStatuses()]); + } + + /** * Update the statuses * * @NoAdminRequired diff --git a/apps/dashboard/lib/Controller/DashboardController.php b/apps/dashboard/lib/Controller/DashboardController.php index 61b7ccc83ad..8375858cbee 100644 --- a/apps/dashboard/lib/Controller/DashboardController.php +++ b/apps/dashboard/lib/Controller/DashboardController.php @@ -30,7 +30,7 @@ declare(strict_types=1); */ namespace OCA\Dashboard\Controller; -use JsonException; +use OCA\Dashboard\Service\DashboardService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\Attribute\OpenAPI; @@ -54,7 +54,8 @@ class DashboardController extends Controller { private IManager $dashboardManager, private IConfig $config, private IL10N $l10n, - private ?string $userId + private ?string $userId, + private DashboardService $service, ) { parent::__construct($appName, $request); } @@ -68,8 +69,6 @@ class DashboardController extends Controller { \OCP\Util::addStyle('dashboard', 'dashboard'); \OCP\Util::addScript('dashboard', 'main', 'theming'); - $systemDefault = $this->config->getAppValue('dashboard', 'layout', 'recommendations,spreed,mail,calendar'); - $userLayout = array_filter(explode(',', $this->config->getUserValue($this->userId, 'dashboard', 'layout', $systemDefault)), fn (string $value) => $value !== ''); $widgets = array_map(function (IWidget $widget) { return [ 'id' => $widget->getId(), @@ -78,19 +77,10 @@ class DashboardController extends Controller { 'url' => $widget->getUrl() ]; }, $this->dashboardManager->getWidgets()); - $configStatuses = $this->config->getUserValue($this->userId, 'dashboard', 'statuses', ''); - try { - // Parse the old format - $statuses = json_decode($configStatuses, true, 512, JSON_THROW_ON_ERROR); - // We avoid getting an empty array as it will not produce an object in UI's JS - $statuses = array_keys(array_filter($statuses, static fn (bool $value) => $value)); - } catch (JsonException $e) { - $statuses = array_filter(explode(',', $configStatuses), fn (string $value) => $value !== ''); - } $this->initialState->provideInitialState('panels', $widgets); - $this->initialState->provideInitialState('statuses', $statuses); - $this->initialState->provideInitialState('layout', $userLayout); + $this->initialState->provideInitialState('statuses', $this->service->getStatuses()); + $this->initialState->provideInitialState('layout', $this->service->getLayout()); $this->initialState->provideInitialState('appStoreEnabled', $this->config->getSystemValueBool('appstoreenabled', true)); $this->initialState->provideInitialState('firstRun', $this->config->getUserValue($this->userId, 'dashboard', 'firstRun', '1') === '1'); $this->config->setUserValue($this->userId, 'dashboard', 'firstRun', '0'); diff --git a/apps/dashboard/lib/Service/DashboardService.php b/apps/dashboard/lib/Service/DashboardService.php new file mode 100644 index 00000000000..8b880826628 --- /dev/null +++ b/apps/dashboard/lib/Service/DashboardService.php @@ -0,0 +1,62 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024, Kate Döen <kate.doeen@nextcloud.com> + * + * @author Kate Döen <kate.doeen@nextcloud.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 OCA\Dashboard\Service; + +use JsonException; +use OCP\IConfig; + +class DashboardService { + public function __construct( + private IConfig $config, + private String $userId, + ) { + + } + + /** + * @return list<string> + */ + public function getLayout(): array { + $systemDefault = $this->config->getAppValue('dashboard', 'layout', 'recommendations,spreed,mail,calendar'); + return array_values(array_filter(explode(',', $this->config->getUserValue($this->userId, 'dashboard', 'layout', $systemDefault)), fn (string $value) => $value !== '')); + } + + /** + * @return list<string> + */ + public function getStatuses() { + $configStatuses = $this->config->getUserValue($this->userId, 'dashboard', 'statuses', ''); + try { + // Parse the old format + /** @var array<string, bool> $statuses */ + $statuses = json_decode($configStatuses, true, 512, JSON_THROW_ON_ERROR); + // We avoid getting an empty array as it will not produce an object in UI's JS + return array_keys(array_filter($statuses, static fn (bool $value) => $value)); + } catch (JsonException $e) { + return array_values(array_filter(explode(',', $configStatuses), fn (string $value) => $value !== '')); + } + } +} diff --git a/apps/dashboard/openapi.json b/apps/dashboard/openapi.json index 495479ae837..7c537b4604c 100644 --- a/apps/dashboard/openapi.json +++ b/apps/dashboard/openapi.json @@ -432,6 +432,76 @@ } }, "/ocs/v2.php/apps/dashboard/api/v3/layout": { + "get": { + "operationId": "dashboard_api-get-layout", + "summary": "Get the layout", + "tags": [ + "dashboard_api" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Layout returned", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "layout" + ], + "properties": { + "layout": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, "post": { "operationId": "dashboard_api-update-layout", "summary": "Update the layout", @@ -516,6 +586,76 @@ } }, "/ocs/v2.php/apps/dashboard/api/v3/statuses": { + "get": { + "operationId": "dashboard_api-get-statuses", + "summary": "Get the statuses", + "tags": [ + "dashboard_api" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Statuses returned", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "statuses" + ], + "properties": { + "statuses": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, "post": { "operationId": "dashboard_api-update-statuses", "summary": "Update the statuses", |