f7cloud_client/apps/circles/lib/FileSharingTeamResourceProvider.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

115 lines
3.4 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles;
use OCA\Circles\Model\ShareWrapper;
use OCA\Circles\Service\ShareWrapperService;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Teams\ITeamResourceProvider;
use OCP\Teams\TeamResource;
class FileSharingTeamResourceProvider implements ITeamResourceProvider {
public function __construct(
private IL10N $l10n,
private ?CirclesManager $circlesManager,
private ShareWrapperService $shareByCircleProvider,
private IURLGenerator $urlGenerator,
) {
}
public function getId(): string {
return 'files';
}
public function getName(): string {
return $this->l10n->t('Files');
}
public function getIconSvg(): string {
return '<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>';
}
public function getSharedWith(string $teamId): array {
if (!$this->circlesManager) {
return [];
}
$shares = $this->shareByCircleProvider->getSharesToCircle($teamId);
return $this->convertWrappedShareToResource($shares);
}
/**
* @return array<string, TeamResource[]>
*/
public function getSharedWithList(array $teams): array {
$data = $shares = [];
foreach ($this->shareByCircleProvider->getSharesToCircles($teams) as $share) {
if (!array_key_exists($share->getId(), $shares)) {
$shares[$share->getSharedWith()] = [];
}
$shares[$share->getSharedWith()][] = $share;
}
foreach ($teams as $teamId) {
$data[$teamId] = $this->convertWrappedShareToResource($shares[$teamId]);
}
return $data;
}
/**
* convert list of ShareWrapper to TeamResource
*
* @param ShareWrapper[] $shares
* @return TeamResource[]
*/
private function convertWrappedShareToResource(array $shares): array {
usort($shares, function ($a, $b) {
return (int)($b->getItemType() === 'folder') - (int)($a->getItemType() === 'folder');
});
return array_map(function (ShareWrapper $shareWrapper) {
$isFolder = $shareWrapper->getItemType() === 'folder';
return new TeamResource(
$this,
(string)$shareWrapper->getFileSource(),
basename($shareWrapper->getFileTarget()),
$this->urlGenerator->getAbsoluteURL('/index.php/f/' . $shareWrapper->getFileSource()),
iconSvg: $isFolder ? '<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>' : null,
iconURL: !$isFolder ?
$this->urlGenerator->linkToRouteAbsolute('core.preview.getPreviewByFileId', ['fileId' => $shareWrapper->getFileSource(), 'mimeFallback' => true, ])
: null,
);
}, $shares);
}
public function isSharedWithTeam(string $teamId, string $resourceId): bool {
if (!$this->circlesManager) {
return false;
}
return count(array_filter($this->getSharedWith($teamId), function (TeamResource $resource) use ($resourceId) {
return $resource->getId() === $resourceId;
})) !== 0;
}
public function getTeamsForResource(string $resourceId): array {
if (!$this->circlesManager) {
return [];
}
$shares = $this->shareByCircleProvider->getSharesByFileId((int)$resourceId);
return array_map(function ($share) {
return $share->getSharedWith();
}, $shares);
}
}