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

182 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\RelatedResources\RelatedResourceProviders;
use OCA\Circles\CirclesManager;
use OCA\Circles\Model\FederatedUser;
use OCA\Circles\Model\Member;
use OCA\GroupFolders\Folder\FolderManager;
use OCA\RelatedResources\Db\FilesShareRequest;
use OCA\RelatedResources\Exceptions\GroupFolderNotFoundException;
use OCA\RelatedResources\IRelatedResource;
use OCA\RelatedResources\IRelatedResourceProvider;
use OCA\RelatedResources\Model\RelatedResource;
use OCA\RelatedResources\Tools\Traits\TArrayTools;
use OCP\AutoloadNotAllowedException;
use OCP\Files\IRootFolder;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Server;
use Psr\Container\ContainerExceptionInterface;
class GroupFoldersRelatedResourceProvider implements IRelatedResourceProvider {
use TArrayTools;
private const PROVIDER_ID = 'groupfolders';
private ?FolderManager $folderManager = null;
/**
* @var array<int, \OCA\GroupFolders\Folder\FolderDefinitionWithMappings>
*/
private array $folders = [];
public function __construct(
private IRootFolder $rootFolder,
private IURLGenerator $urlGenerator,
private IL10N $l10n,
private FilesShareRequest $filesShareRequest,
) {
try {
$this->folderManager = Server::get(FolderManager::class);
$this->folders = $this->folderManager->getAllFolders();
} catch (ContainerExceptionInterface|AutoloadNotAllowedException $e) {
}
}
public function getProviderId(): string {
return self::PROVIDER_ID;
}
public function loadWeightCalculator(): array {
return [];
}
public function getRelatedFromItem(CirclesManager $circlesManager, string $itemId): ?IRelatedResource {
$itemId = (int)$itemId;
if ($itemId < 1) {
return null;
}
// need to get the groupfolders parent, based on itemId
try {
$folder = $this->getFolder($itemId);
} catch (GroupFolderNotFoundException $e) {
return null;
}
$related = $this->convertToRelatedResource($folder);
$this->processApplicableMap($circlesManager, $related, $folder['groups'] ?? []);
return $related;
}
public function getItemsAvailableToEntity(FederatedUser $entity): array {
$items = [];
foreach ($this->folders as $folder) {
$folder = $folder->toArray();
foreach ($folder['groups'] as $k => $entry) {
if ($entity->getBasedOn()->getSource() === Member::TYPE_GROUP
&& $entry['type'] === 'group'
&& $k === $entity->getUserId()) {
$items[] = (string)$folder['id'];
}
if ($entity->getBasedOn()->getSource() === Member::TYPE_CIRCLE
&& $entry['type'] === 'circle'
&& $k === $entity->getSingleId()) {
$items[] = (string)$folder['id'];
}
}
}
return $items;
}
public function improveRelatedResource(CirclesManager $circlesManager, IRelatedResource $entry): void {
}
/**
* @param array{acl: bool, groups: array<array-key, array<array-key, int|string>>, id: int, mount_point: mixed, quota: int, size: 0} $folderData
*/
public function convertToRelatedResource(array $folderData): IRelatedResource {
$related = new RelatedResource(self::PROVIDER_ID, (string)($folderData['id'] ?? 0));
$folderName = $folderData['mount_point'] ?? 'groupfolder';
$related->setTitle($folderName);
$related->setSubtitle($this->l10n->t('Group Folder'));
$related->setTooltip($this->l10n->t('Group Folder "%s"', '/' . $folderName . '/'));
try {
$related->setIcon(
$this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->imagePath(
'groupfolders',
'app.svg'
)
)
);
} catch (\Exception $e) {
// try/catch can be removed once groupfolders is released for nc27
}
$related->setUrl(
$this->urlGenerator->linkToRouteAbsolute(
'files.view.index',
['dir' => '/' . $folderName]
)
);
$related->setMetaArray(RelatedResource::ITEM_KEYWORDS, [$folderName]);
return $related;
}
/**
* @param RelatedResource $related
* @param array<array-key, array<array-key, int|string>> $applicableMap
*/
public function processApplicableMap(
CirclesManager $circlesManager,
RelatedResource $related,
array $applicableMap,
): void {
foreach ($applicableMap as $k => $entry) {
$entityId = '';
if ($entry['type'] === 'circle') {
$entityId = (string)$k;
} elseif ($entry['type'] === 'group') {
$federatedGroup = $circlesManager->getFederatedUser($k, Member::TYPE_GROUP);
$entityId = $federatedGroup->getSingleId();
}
$related->addRecipient($entityId)
->setAsGroupShared();
}
}
/**
* @param int $folderId
*
* @return array{acl: bool, groups: array<array-key, array<array-key, int|string>>, id: int, mount_point: mixed, quota: int, size: 0}
* @throws GroupFolderNotFoundException
*/
public function getFolder(int $folderId): array {
foreach ($this->folders as $folder) {
$folder = $folder->toArray();
if ($folder['id'] === $folderId) {
return $folder;
}
}
throw new GroupFolderNotFoundException();
}
}