summaryrefslogtreecommitdiffstats
path: root/lib/public
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2024-03-05 11:57:07 +0100
committerGitHub <noreply@github.com>2024-03-05 11:57:07 +0100
commitad8cb2ce7f4f619158fc7ac6a7ea414d1508658e (patch)
tree7e9bc7a7c0641edcb942abe6b2c0b46028014a83 /lib/public
parentd65e46f31367e65b03d4ab829baeacbece04850a (diff)
parentc7813bfdaf09626dfed13c63b28a3919018d4403 (diff)
downloadnextcloud-server-ad8cb2ce7f4f619158fc7ac6a7ea414d1508658e.tar.gz
nextcloud-server-ad8cb2ce7f4f619158fc7ac6a7ea414d1508658e.zip
Merge pull request #43855 from nextcloud/feat/team-provider
Implement team provider api
Diffstat (limited to 'lib/public')
-rw-r--r--lib/public/AppFramework/Bootstrap/IRegistrationContext.php8
-rw-r--r--lib/public/Teams/ITeamManager.php58
-rw-r--r--lib/public/Teams/ITeamResourceProvider.php76
-rw-r--r--lib/public/Teams/Team.php73
-rw-r--r--lib/public/Teams/TeamResource.php129
5 files changed, 344 insertions, 0 deletions
diff --git a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
index b39c8591a7e..f515180cef5 100644
--- a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
+++ b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
@@ -352,6 +352,14 @@ interface IRegistrationContext {
public function registerCalendarRoomBackend(string $class): void;
/**
+ * @param string $class
+ * @psalm-param class-string<\OCP\Calendar\Room\IBackend> $actionClass
+ * @return void
+ * @since 29.0.0
+ */
+ public function registerTeamResourceProvider(string $class): void;
+
+ /**
* Register an implementation of \OCP\UserMigration\IMigrator that
* will handle the implementation of a migrator
*
diff --git a/lib/public/Teams/ITeamManager.php b/lib/public/Teams/ITeamManager.php
new file mode 100644
index 00000000000..51d8a1feb5a
--- /dev/null
+++ b/lib/public/Teams/ITeamManager.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * @copyright Copyright (c) 2024 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.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\Teams;
+
+/**
+ * @since 29.0.0
+ */
+interface ITeamManager {
+ /**
+ * Get all providers that have registered as a team resource provider
+ *
+ * @return ITeamResourceProvider[]
+ * @since 29.0.0
+ */
+ public function getProviders(): array;
+
+ /**
+ * Get a specific team resource provider by its id
+ *
+ * @since 29.0.0
+ */
+ public function getProvider(string $providerId): ITeamResourceProvider;
+
+ /**
+ * Returns all team resources for a given team and user
+ *
+ * @return TeamResource[]
+ * @since 29.0.0
+ */
+ public function getSharedWith(string $teamId, string $userId): array;
+
+ /**
+ * Returns all teams for a given resource and user
+ *
+ * @since 29.0.0
+ */
+ public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array;
+}
diff --git a/lib/public/Teams/ITeamResourceProvider.php b/lib/public/Teams/ITeamResourceProvider.php
new file mode 100644
index 00000000000..722c877555e
--- /dev/null
+++ b/lib/public/Teams/ITeamResourceProvider.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @copyright Copyright (c) 2024 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.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\Teams;
+
+/**
+ * Implement a provider of resources that are shared or owned by a team
+ *
+ * @since 29.0.0
+ */
+interface ITeamResourceProvider {
+
+ /**
+ * Unique identifier used to identify the provider (app id)
+ *
+ * @since 29.0.0
+ */
+ public function getId(): string;
+
+ /**
+ * User visible name of the provider (app name)
+ *
+ * @since 29.0.0
+ */
+ public function getName(): string;
+
+ /**
+ * Svg icon to show next to the provider (app icon)
+ *
+ * @since 29.0.0
+ */
+ public function getIconSvg(): string;
+
+ /**
+ * Return all resources that are shared to the given team id for the current provider
+ *
+ * @param string $teamId
+ * @return TeamResource[]
+ * @since 29.0.0
+ */
+ public function getSharedWith(string $teamId): array;
+
+ /**
+ * Check if a resource is shared with the given team
+ *
+ * @since 29.0.0
+ */
+ public function isSharedWithTeam(string $teamId, string $resourceId): bool;
+
+ /**
+ * Return team ids that a resource is shared with or owned by
+ *
+ * @return string[]
+ * @since 29.0.0
+ */
+ public function getTeamsForResource(string $resourceId): array;
+}
diff --git a/lib/public/Teams/Team.php b/lib/public/Teams/Team.php
new file mode 100644
index 00000000000..d3d6c2d143d
--- /dev/null
+++ b/lib/public/Teams/Team.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @copyright Copyright (c) 2024 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.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\Teams;
+
+/**
+ * Simple abstraction to represent a team in the public API
+ *
+ * In the backend a team is a circle identified by the circles singleId
+ *
+ * @since 29.0.0
+ */
+class Team implements \JsonSerializable {
+
+ /**
+ * @since 29.0.0
+ */
+ public function __construct(private string $teamId, private string $displayName, private ?string $link) {
+ }
+
+ /**
+ * Unique identifier of the team (singleId of the circle)
+ *
+ * @since 29.0.0
+ */
+ public function getId(): string {
+ return $this->teamId;
+ }
+
+ /**
+ * @since 29.0.0
+ */
+ public function getDisplayName(): string {
+ return $this->displayName;
+ }
+
+ /**
+ * @since 29.0.0
+ */
+ public function getLink(): ?string {
+ return $this->link;
+ }
+
+ /**
+ * @since 29.0.0
+ */
+ public function jsonSerialize(): array {
+ return [
+ 'teamId' => $this->teamId,
+ 'displayName' => $this->displayName,
+ 'link' => $this->link,
+ ];
+ }
+}
diff --git a/lib/public/Teams/TeamResource.php b/lib/public/Teams/TeamResource.php
new file mode 100644
index 00000000000..569583bb393
--- /dev/null
+++ b/lib/public/Teams/TeamResource.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * @copyright Copyright (c) 2024 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.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\Teams;
+
+/**
+ * @since 29.0.0
+ */
+class TeamResource implements \JsonSerializable {
+ /**
+ * @since 29.0.0
+ */
+ public function __construct(
+ private ITeamResourceProvider $teamResourceProvider,
+ private string $resourceId,
+ private string $label,
+ private string $url,
+ private ?string $iconSvg = null,
+ private ?string $iconURL = null,
+ private ?string $iconEmoji = null,
+ ) {
+ }
+
+ /**
+ * Returns the provider details for the current resource
+ *
+ * @since 29.0.0
+ */
+ public function getProvider(): ITeamResourceProvider {
+ return $this->teamResourceProvider;
+ }
+
+ /**
+ * Unique id of the resource (e.g. primary key id)
+ * @since 29.0.0
+ */
+ public function getId(): string {
+ return $this->resourceId;
+ }
+
+ /**
+ * User visible label when listing resources
+ *
+ * @since 29.0.0
+ */
+ public function getLabel(): string {
+ return $this->label;
+ }
+
+ /**
+ * Absolute url to navigate the user to the resource
+ *
+ * @since 29.0.0
+ */
+ public function getUrl(): string {
+ return $this->url;
+ }
+
+ /**
+ * Svg icon to show next to the name for the resource
+ *
+ * From all icons the first one returning not null will be picked in order: iconEmoji, iconSvg, iconUrl
+ *
+ * @since 29.0.0
+ */
+ public function getIconSvg(): ?string {
+ return $this->iconSvg;
+ }
+
+ /**
+ * Image url of the icon to show next to the name for the resource
+ *
+ * From all icons the first one returning not null will be picked in order: iconEmoji, iconSvg, iconUrl
+ *
+ * @since 29.0.0
+ */
+ public function getIconURL(): ?string {
+ return $this->iconURL;
+ }
+
+ /**
+ * Emoji show next to the name for the resource
+ *
+ * From all icons the first one returning not null will be picked in order: iconEmoji, iconSvg, iconUrl
+ *
+ * @since 29.0.0
+ */
+ public function getIconEmoji(): ?string {
+ return $this->iconEmoji;
+ }
+
+ /**
+ * @since 29.0.0
+ */
+ public function jsonSerialize(): array {
+ return [
+ 'id' => $this->resourceId,
+ 'label' => $this->label,
+ 'url' => $this->url,
+ 'iconSvg' => $this->iconSvg,
+ 'iconURL' => $this->iconURL,
+ 'iconEmoji' => $this->iconEmoji,
+ 'provider' => [
+ 'id' => $this->teamResourceProvider->getId(),
+ 'name' => $this->teamResourceProvider->getName(),
+ 'icon' => $this->teamResourceProvider->getIconSvg(),
+ ]
+ ];
+ }
+}