Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build/psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4297,6 +4297,11 @@
<code><![CDATA[$tag]]></code>
</MoreSpecificImplementedParamType>
</file>
<file src="lib/private/Teams/TeamManager.php">
<UndefinedDocblockClass>
<code><![CDATA[Circle]]></code>
</UndefinedDocblockClass>
</file>
<file src="lib/private/URLGenerator.php">
<InvalidReturnStatement>
<code><![CDATA[$path]]></code>
Expand Down
20 changes: 9 additions & 11 deletions core/Controller/TeamsApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
use OCP\IRequest;
use OCP\Teams\ITeamManager;
use OCP\Teams\Team;
use OCP\Teams\TeamResource;

/**
* @psalm-import-type CoreTeamResource from ResponseDefinitions
* @psalm-import-type CoreTeam from ResponseDefinitions
* @psalm-import-type CoreTeamWithResources from ResponseDefinitions
* @property $userId string
*/
class TeamsApiController extends OCSController {
Expand All @@ -44,21 +46,18 @@ public function __construct(
#[NoAdminRequired]
#[ApiRoute(verb: 'GET', url: '/{teamId}/resources', root: '/teams')]
public function resolveOne(string $teamId): DataResponse {
/**
* @var list<CoreTeamResource> $resolvedResources
* @psalm-suppress PossiblyNullArgument The route is limited to logged-in users
*/
/** @psalm-suppress PossiblyNullArgument The route is limited to logged-in users */
$resolvedResources = $this->teamManager->getSharedWith($teamId, $this->userId);

return new DataResponse(['resources' => $resolvedResources]);
return new DataResponse(['resources' => array_map(static fn (TeamResource $resource) => $resource->jsonSerialize(), $resolvedResources)]);
}

/**
* Get all teams of a resource
*
* @param string $providerId Identifier of the provider (e.g. deck, talk, collectives)
* @param string $resourceId Unique id of the resource to list teams for (e.g. deck board id)
* @return DataResponse<Http::STATUS_OK, array{teams: list<CoreTeam>}, array{}>
* @return DataResponse<Http::STATUS_OK, array{teams: list<CoreTeamWithResources>}, array{}>
*
* 200: Teams returned
*/
Expand All @@ -67,16 +66,15 @@ public function resolveOne(string $teamId): DataResponse {
public function listTeams(string $providerId, string $resourceId): DataResponse {
/** @psalm-suppress PossiblyNullArgument The route is limited to logged-in users */
$teams = $this->teamManager->getTeamsForResource($providerId, $resourceId, $this->userId);
/** @var list<CoreTeam> $teams */
$teams = array_values(array_map(function (Team $team) {
$sharesPerTeams = $this->teamManager->getSharedWithList(array_map(fn (Team $team): string => $team->getId(), $teams), $this->userId);
$listTeams = array_values(array_map(function (Team $team) use ($sharesPerTeams) {
$response = $team->jsonSerialize();
/** @psalm-suppress PossiblyNullArgument The route is limited to logged in users */
$response['resources'] = $this->teamManager->getSharedWith($team->getId(), $this->userId);
$response['resources'] = array_map(static fn (TeamResource $resource) => $resource->jsonSerialize(), $sharesPerTeams[$team->getId()] ?? []);
return $response;
}, $teams));

return new DataResponse([
'teams' => $teams,
'teams' => $listTeams,
]);
}
}
29 changes: 19 additions & 10 deletions core/ResponseDefinitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -149,19 +149,28 @@
* }
*
* @psalm-type CoreTeam = array{
* id: string,
* name: string,
* icon: string,
* teamId: string,
* displayName: string,
* link: ?string,
* }
*
* @psalm-type CoreTeamResource = array{
* id: int,
* label: string,
* url: string,
* iconSvg: ?string,
* iconURL: ?string,
* iconEmoji: ?string,
* }
* id: string,
* label: string,
* url: string,
* iconSvg: ?string,
* iconURL: ?string,
* iconEmoji: ?string,
* provider: array{
* id: string,
* name: string,
* icon: string,
* },
* }
*
* @psalm-type CoreTeamWithResources = CoreTeam&array{
* resources: list<CoreTeamResource>,
* }
*
* @psalm-type CoreTaskProcessingShape = array{
* name: string,
Expand Down
63 changes: 52 additions & 11 deletions core/openapi-full.json
Original file line number Diff line number Diff line change
Expand Up @@ -898,19 +898,20 @@
"Team": {
"type": "object",
"required": [
"id",
"name",
"icon"
"teamId",
"displayName",
"link"
],
"properties": {
"id": {
"teamId": {
"type": "string"
},
"name": {
"displayName": {
"type": "string"
},
"icon": {
"type": "string"
"link": {
"type": "string",
"nullable": true
}
}
},
Expand All @@ -922,12 +923,12 @@
"url",
"iconSvg",
"iconURL",
"iconEmoji"
"iconEmoji",
"provider"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
"type": "string"
},
"label": {
"type": "string"
Expand All @@ -946,9 +947,49 @@
"iconEmoji": {
"type": "string",
"nullable": true
},
"provider": {
"type": "object",
"required": [
"id",
"name",
"icon"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"icon": {
"type": "string"
}
}
}
}
},
"TeamWithResources": {
"allOf": [
{
"$ref": "#/components/schemas/Team"
},
{
"type": "object",
"required": [
"resources"
],
"properties": {
"resources": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamResource"
}
}
}
}
]
},
"TextProcessingTask": {
"type": "object",
"required": [
Expand Down Expand Up @@ -6306,7 +6347,7 @@
"teams": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Team"
"$ref": "#/components/schemas/TeamWithResources"
}
}
}
Expand Down
63 changes: 52 additions & 11 deletions core/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -898,19 +898,20 @@
"Team": {
"type": "object",
"required": [
"id",
"name",
"icon"
"teamId",
"displayName",
"link"
],
"properties": {
"id": {
"teamId": {
"type": "string"
},
"name": {
"displayName": {
"type": "string"
},
"icon": {
"type": "string"
"link": {
"type": "string",
"nullable": true
}
}
},
Expand All @@ -922,12 +923,12 @@
"url",
"iconSvg",
"iconURL",
"iconEmoji"
"iconEmoji",
"provider"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
"type": "string"
},
"label": {
"type": "string"
Expand All @@ -946,9 +947,49 @@
"iconEmoji": {
"type": "string",
"nullable": true
},
"provider": {
"type": "object",
"required": [
"id",
"name",
"icon"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"icon": {
"type": "string"
}
}
}
}
},
"TeamWithResources": {
"allOf": [
{
"$ref": "#/components/schemas/Team"
},
{
"type": "object",
"required": [
"resources"
],
"properties": {
"resources": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamResource"
}
}
}
}
]
},
"TextProcessingTask": {
"type": "object",
"required": [
Expand Down Expand Up @@ -6306,7 +6347,7 @@
"teams": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Team"
"$ref": "#/components/schemas/TeamWithResources"
}
}
}
Expand Down
45 changes: 36 additions & 9 deletions lib/private/Teams/TeamManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,24 +84,38 @@ public function getSharedWith(string $teamId, string $userId): array {
return array_values($resources);
}

public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array {
public function getSharedWithList(array $teams, string $userId): array {
if (!$this->hasTeamSupport()) {
return [];
}

$provider = $this->getProvider($providerId);
return array_values(array_filter(array_map(function ($teamId) use ($userId) {
$team = $this->getTeam($teamId, $userId);
if ($team === null) {
return null;
$resources = [];
foreach ($this->getProviders() as $provider) {
if (method_exists($provider, 'getSharedWithList')) {
$resources[] = $provider->getSharedWithList($teams, $userId);
} else {
foreach ($teams as $team) {
$resources[] = [$team->getId() => $provider->getSharedWith($team->getId())];
}
}
}

return array_merge_recursive(...$resources);
}

public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array {
if (!$this->hasTeamSupport()) {
return [];
}

$provider = $this->getProvider($providerId);
return array_map(function (Circle $team) {
return new Team(
$teamId,
$team->getSingleId(),
$team->getDisplayName(),
$this->urlGenerator->linkToRouteAbsolute('contacts.contacts.directcircle', ['singleId' => $teamId]),
$this->urlGenerator->linkToRouteAbsolute('contacts.contacts.directcircle', ['singleId' => $team->getSingleId()]),
);
}, $provider->getTeamsForResource($resourceId))));
}, $this->getTeams($provider->getTeamsForResource($resourceId), $userId));
}

private function getTeam(string $teamId, string $userId): ?Circle {
Expand All @@ -117,4 +131,17 @@ private function getTeam(string $teamId, string $userId): ?Circle {
return null;
}
}

/**
* @return Circle[]
*/
private function getTeams(array $teams, string $userId): array {
if (!$this->hasTeamSupport()) {
return [];
}

$federatedUser = $this->circlesManager->getFederatedUser($userId, Member::TYPE_USER);
$this->circlesManager->startSession($federatedUser);
return $this->circlesManager->getCirclesByIds($teams);
}
}
8 changes: 8 additions & 0 deletions lib/public/Teams/ITeamManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,12 @@ public function getSharedWith(string $teamId, string $userId): array;
* @since 29.0.0
*/
public function getTeamsForResource(string $providerId, string $resourceId, string $userId): array;

/**
* @param list<Team> $teams
* @return array<string, list<TeamResource>>
*
* @since 33.0.0
*/
public function getSharedWithList(array $teams, string $userId): array;
}
Loading
Loading