summaryrefslogtreecommitdiffstats
path: root/core/l10n/sc.json
diff options
context:
space:
mode:
Diffstat (limited to 'core/l10n/sc.json')
-rw-r--r--core/l10n/sc.json2
1 files changed, 1 insertions, 1 deletions
diff --git a/core/l10n/sc.json b/core/l10n/sc.json
index 462642959ac..702186dc5cb 100644
--- a/core/l10n/sc.json
+++ b/core/l10n/sc.json
@@ -301,9 +301,9 @@
"It looks like you are trying to reinstall your Nextcloud. However the file CAN_INSTALL is missing from your config directory. Please create the file CAN_INSTALL in your config folder to continue." : "Paret chi ses chirchende de torrare a installare Nextcloud. In cada manera, mancat s'archìviu CAN_INSTALL in sa cartella de cunfiguratzione. Crea s'archìviu CAN_INSTALL in sa cartella de cunfiguratzione pro sighire.",
"Could not remove CAN_INSTALL from the config folder. Please remove this file manually." : "No at fatu a nche bogare CAN_INSTALL dae sa cartella de cunfiguratzione. Boga custu archìviu a manu.",
"This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Custa aplicatzione rechedet JavaScript pro un'operatzione curreta. {linkstart} Ativa JavaScript{linkend} e torra a carrigare sa pàgina.",
- "Get your own free account" : "Otene su contu tuo a gratis",
"Skip to main content" : "Brinca a su cuntenutu printzipale",
"Skip to navigation of app" : "Brinca a sa navigatzione de s'aplicatzione",
+ "Get your own free account" : "Otene su contu tuo a gratis",
"More apps" : "Àteras aplicatziones",
"More" : "Àteru",
"More apps menu" : "Àteros menu de aplicatziones",
4'>124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
<?php

declare(strict_types=1);

/**
 * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

namespace OCA\Dashboard\Controller;

use OCA\Dashboard\ResponseDefinitions;
use OCA\Dashboard\Service\DashboardService;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\ApiRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\Dashboard\IAPIWidget;
use OCP\Dashboard\IAPIWidgetV2;
use OCP\Dashboard\IButtonWidget;
use OCP\Dashboard\IIconWidget;
use OCP\Dashboard\IManager;
use OCP\Dashboard\IOptionWidget;
use OCP\Dashboard\IReloadableWidget;
use OCP\Dashboard\IWidget;
use OCP\Dashboard\Model\WidgetButton;
use OCP\Dashboard\Model\WidgetItem;

use OCP\Dashboard\Model\WidgetOptions;
use OCP\IConfig;
use OCP\IRequest;

/**
 * @psalm-import-type DashboardWidget from ResponseDefinitions
 * @psalm-import-type DashboardWidgetItem from ResponseDefinitions
 * @psalm-import-type DashboardWidgetItems from ResponseDefinitions
 */
class DashboardApiController extends OCSController {

	public function __construct(
		string $appName,
		IRequest $request,
		private IManager $dashboardManager,
		private IConfig $config,
		private ?string $userId,
		private DashboardService $service,
	) {
		parent::__construct($appName, $request);
	}

	/**
	 * @param string[] $widgetIds Limit widgets to given ids
	 * @return IWidget[]
	 */
	private function getShownWidgets(array $widgetIds): array {
		if (empty($widgetIds)) {
			$systemDefault = $this->config->getAppValue('dashboard', 'layout', 'recommendations,spreed,mail,calendar');
			$widgetIds = explode(',', $this->config->getUserValue($this->userId, 'dashboard', 'layout', $systemDefault));
		}

		return array_filter(
			$this->dashboardManager->getWidgets(),
			static function (IWidget $widget) use ($widgetIds) {
				return in_array($widget->getId(), $widgetIds);
			},
		);
	}

	/**
	 * Get the items for the widgets
	 *
	 * @param array<string, string> $sinceIds Array indexed by widget Ids, contains date/id from which we want the new items
	 * @param int $limit Limit number of result items per widget
	 * @psalm-param int<1, 30> $limit
	 * @param list<string> $widgets Limit results to specific widgets
	 * @return DataResponse<Http::STATUS_OK, array<string, list<DashboardWidgetItem>>, array{}>
	 *
	 * 200: Widget items returned
	 */
	#[NoAdminRequired]
	#[NoCSRFRequired]
	#[ApiRoute(verb: 'GET', url: '/api/v1/widget-items')]
	public function getWidgetItems(array $sinceIds = [], int $limit = 7, array $widgets = []): DataResponse {
		$items = [];
		$widgets = $this->getShownWidgets($widgets);
		foreach ($widgets as $widget) {
			if ($widget instanceof IAPIWidget) {
				$items[$widget->getId()] = array_map(static function (WidgetItem $item) {
					return $item->jsonSerialize();
				}, $widget->getItems($this->userId, $sinceIds[$widget->getId()] ?? null, $limit));
			}
		}

		return new DataResponse($items);
	}

	/**
	 * Get the items for the widgets
	 *
	 * @param array<string, string> $sinceIds Array indexed by widget Ids, contains date/id from which we want the new items
	 * @param int $limit Limit number of result items per widget, not more than 30 are allowed
	 * @psalm-param int<1, 30> $limit
	 * @param list<string> $widgets Limit results to specific widgets
	 * @return DataResponse<Http::STATUS_OK, array<string, DashboardWidgetItems>, array{}>
	 *
	 * 200: Widget items returned
	 */
	#[NoAdminRequired]
	#[NoCSRFRequired]
	#[ApiRoute(verb: 'GET', url: '/api/v2/widget-items')]
	public function getWidgetItemsV2(array $sinceIds = [], int $limit = 7, array $widgets = []): DataResponse {
		$items = [];
		$widgets = $this->getShownWidgets($widgets);
		foreach ($widgets as $widget) {
			if ($widget instanceof IAPIWidgetV2) {
				$items[$widget->getId()] = $widget
					->getItemsV2($this->userId, $sinceIds[$widget->getId()] ?? null, $limit)
					->jsonSerialize();
			}
		}

		return new DataResponse($items);
	}

	/**
	 * Get the widgets
	 *
	 * @return DataResponse<Http::STATUS_OK, array<string, DashboardWidget>, array{}>
	 *
	 * 200: Widgets returned
	 */
	#[NoAdminRequired]
	#[NoCSRFRequired]
	#[ApiRoute(verb: 'GET', url: '/api/v1/widgets')]
	public function getWidgets(): DataResponse {
		$widgets = $this->dashboardManager->getWidgets();

		$items = array_map(function (IWidget $widget) {
			$options = ($widget instanceof IOptionWidget) ? $widget->getWidgetOptions() : WidgetOptions::getDefault();
			$data = [
				'id' => $widget->getId(),
				'title' => $widget->getTitle(),
				'order' => $widget->getOrder(),
				'icon_class' => $widget->getIconClass(),
				'icon_url' => ($widget instanceof IIconWidget) ? $widget->getIconUrl() : '',
				'widget_url' => $widget->getUrl(),
				'item_icons_round' => $options->withRoundItemIcons(),
				'item_api_versions' => [],
				'reload_interval' => 0,
			];
			if ($widget instanceof IButtonWidget) {
				$data += [
					'buttons' => array_map(function (WidgetButton $button) {
						return [
							'type' => $button->getType(),
							'text' => $button->getText(),
							'link' => $button->getLink(),
						];
					}, $widget->getWidgetButtons($this->userId)),
				];
			}
			if ($widget instanceof IReloadableWidget) {
				$data['reload_interval'] = $widget->getReloadInterval();
			}
			if ($widget instanceof IAPIWidget) {
				$data['item_api_versions'][] = 1;
			}
			if ($widget instanceof IAPIWidgetV2) {
				$data['item_api_versions'][] = 2;
			}
			return $data;
		}, $widgets);

		return new DataResponse($items);
	}

	/**
	 * Get the layout
	 *
	 * @return DataResponse<Http::STATUS_OK, array{layout: list<string>}, array{}>
	 *
	 * 200: Layout returned
	 */
	#[NoAdminRequired]
	#[ApiRoute(verb: 'GET', url: '/api/v3/layout')]
	public function getLayout(): DataResponse {
		return new DataResponse(['layout' => $this->service->getLayout()]);
	}

	/**
	 * Update the layout
	 *
	 * @param list<string> $layout The new layout
	 * @return DataResponse<Http::STATUS_OK, array{layout: list<string>}, array{}>
	 *
	 * 200: Statuses updated successfully
	 */
	#[NoAdminRequired]
	#[ApiRoute(verb: 'POST', url: '/api/v3/layout')]
	public function updateLayout(array $layout): DataResponse {
		$this->config->setUserValue($this->userId, 'dashboard', 'layout', implode(',', $layout));
		return new DataResponse(['layout' => $layout]);
	}

	/**
	 * Get the statuses
	 *
	 * @return DataResponse<Http::STATUS_OK, array{statuses: list<string>}, array{}>
	 *
	 * 200: Statuses returned
	 */
	#[NoAdminRequired]
	#[ApiRoute(verb: 'GET', url: '/api/v3/statuses')]
	public function getStatuses(): DataResponse {
		return new DataResponse(['statuses' => $this->service->getStatuses()]);
	}

	/**
	 * Update the statuses
	 *
	 * @param list<string> $statuses The new statuses
	 * @return DataResponse<Http::STATUS_OK, array{statuses: list<string>}, array{}>
	 *
	 * 200: Statuses updated successfully
	 */
	#[NoAdminRequired]
	#[ApiRoute(verb: 'POST', url: '/api/v3/statuses')]
	public function updateStatuses(array $statuses): DataResponse {
		$this->config->setUserValue($this->userId, 'dashboard', 'statuses', implode(',', $statuses));
		return new DataResponse(['statuses' => $statuses]);
	}
}