Browse Source
implement dashboard API for clients, new WidgetItem class, new IAPIWidget interface
implement dashboard API for clients, new WidgetItem class, new IAPIWidget interface
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>pull/26430/head
committed by
Julius Härtl
No known key found for this signature in database
GPG Key ID: 4C614C6ED2CDE6DF
4 changed files with 279 additions and 0 deletions
-
3apps/dashboard/appinfo/routes.php
-
86apps/dashboard/lib/Controller/DashboardApiController.php
-
41lib/public/Dashboard/IAPIWidget.php
-
149lib/public/Dashboard/Model/WidgetItem.php
@ -0,0 +1,86 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* @copyright Copyright (c) 2021 Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @author Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @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\Controller; |
|||
|
|||
use OCP\AppFramework\OCSController; |
|||
use OCP\AppFramework\Http\DataResponse; |
|||
use OCP\Dashboard\IManager; |
|||
use OCP\IConfig; |
|||
use OCP\IRequest; |
|||
|
|||
use OCP\Dashboard\IAPIWidget; |
|||
use OCP\Dashboard\Model\WidgetItem; |
|||
|
|||
class DashboardApiController extends OCSController { |
|||
|
|||
/** @var IManager */ |
|||
private $dashboardManager; |
|||
/** @var IConfig */ |
|||
private $config; |
|||
/** @var string|null */ |
|||
private $userId; |
|||
|
|||
public function __construct(string $appName, |
|||
IRequest $request, |
|||
IManager $dashboardManager, |
|||
IConfig $config, |
|||
?string $userId) { |
|||
parent::__construct($appName, $request); |
|||
|
|||
$this->dashboardManager = $dashboardManager; |
|||
$this->config = $config; |
|||
$this->userId = $userId; |
|||
} |
|||
|
|||
/** |
|||
* Example request with Curl: |
|||
* curl -u user:passwd http://my.nc/ocs/v2.php/apps/dashboard/api/v1/widget-items -H Content-Type:application/json -X GET -d '{"sinceIds":{"github_notifications":"2021-03-22T15:01:10Z"}}' |
|||
* |
|||
* @param array $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 |
|||
* |
|||
* @NoAdminRequired |
|||
* @NoCSRFRequired |
|||
*/ |
|||
public function getWidgetItems(array $sinceIds = [], int $limit = 7): DataResponse { |
|||
$items = []; |
|||
|
|||
$systemDefault = $this->config->getAppValue('dashboard', 'layout', 'recommendations,spreed,mail,calendar'); |
|||
$userLayout = explode(',', $this->config->getUserValue($this->userId, 'dashboard', 'layout', $systemDefault)); |
|||
|
|||
$widgets = $this->dashboardManager->getWidgets(); |
|||
foreach ($widgets as $widget) { |
|||
if ($widget instanceof IAPIWidget && in_array($widget->getId(), $userLayout)) { |
|||
$items[$widget->getId()] = array_map(function (WidgetItem $item) { |
|||
return $item->jsonSerialize(); |
|||
}, $widget->getItems($this->userId, $sinceIds[$widget->getId()] ?? null, $limit)); |
|||
} |
|||
} |
|||
|
|||
return new DataResponse($items); |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* @copyright Copyright (c) 2021 Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @author Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @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\Dashboard; |
|||
|
|||
/** |
|||
* interface IAPIWidget |
|||
* |
|||
* @since 22.0.0 |
|||
*/ |
|||
interface IAPIWidget extends IWidget { |
|||
|
|||
/** |
|||
* @return \OCP\Dashboard\Model\WidgetItem[] The widget items |
|||
* @since 22.0.0 |
|||
*/ |
|||
public function getItems(string $userId, ?string $since = null, int $limit = 7): array; |
|||
} |
|||
@ -0,0 +1,149 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* @copyright 2021, Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @author Julien Veyssier <eneiluj@posteo.net> |
|||
* |
|||
* @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\Dashboard\Model; |
|||
|
|||
use JsonSerializable; |
|||
|
|||
/** |
|||
* Interface WidgetItem |
|||
* |
|||
* This class is used by IAPIWidget interface. |
|||
* It represents an widget item data that can be provided to clients via the Dashboard API |
|||
* @see IAPIWidget::getWidgetItems |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
*/ |
|||
final class WidgetItem implements JsonSerializable { |
|||
/** @var string */ |
|||
private $title = ''; |
|||
|
|||
/** @var string */ |
|||
private $subtitle = ''; |
|||
|
|||
/** @var string */ |
|||
private $link = ''; |
|||
|
|||
/** @var string */ |
|||
private $iconUrl = ''; |
|||
|
|||
/** @var string |
|||
* Timestamp or ID used by the dashboard API to avoid getting already retrieved items |
|||
*/ |
|||
private $sinceId = ''; |
|||
|
|||
|
|||
/** |
|||
* WidgetItem constructor |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @param string $type |
|||
*/ |
|||
public function __construct(string $title = '', |
|||
string $subtitle = '', |
|||
string $link = '', |
|||
string $iconUrl = '', |
|||
string $sinceId = '') { |
|||
$this->title = $title; |
|||
$this->subtitle = $subtitle; |
|||
$this->iconUrl = $iconUrl; |
|||
$this->link = $link; |
|||
$this->sinceId = $sinceId; |
|||
} |
|||
|
|||
/** |
|||
* Get the item title |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getTitle(): string { |
|||
return $this->title; |
|||
} |
|||
|
|||
/** |
|||
* Get the item subtitle |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getSubtitle(): string { |
|||
return $this->subtitle; |
|||
} |
|||
|
|||
/** |
|||
* Get the item link |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getLink(): string { |
|||
return $this->link; |
|||
} |
|||
|
|||
/** |
|||
* Get the item icon URL |
|||
* The icon should be a square svg or a jpg/png of at least 44x44px |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getIconUrl(): string { |
|||
return $this->iconUrl; |
|||
} |
|||
|
|||
/** |
|||
* Get the item since ID |
|||
* |
|||
* @since 22.0.0 |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getSinceId(): string { |
|||
return $this->sinceId; |
|||
} |
|||
|
|||
/** |
|||
* @since 22.0.0 |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function jsonSerialize(): array { |
|||
return [ |
|||
'subtitle' => $this->getSubtitle(), |
|||
'title' => $this->getTitle(), |
|||
'link' => $this->getLink(), |
|||
'iconUrl' => $this->getIconUrl(), |
|||
'sinceId' => $this->getSinceId(), |
|||
]; |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue