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

131 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Controller;
use OCA\Circles\Exceptions\FrontendException;
use OCA\Circles\FileSharingTeamResourceProvider;
use OCA\Circles\Model\ModelManager;
use OCA\Circles\Model\Probes\CircleProbe;
use OCA\Circles\Service\CircleService;
use OCA\Circles\Service\ConfigService;
use OCA\Circles\Service\FederatedUserService;
use OCA\Circles\Service\MemberService;
use OCA\Circles\Service\TeamResourceService;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCSController;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
use Psr\Log\LoggerInterface;
class TeamsDashboardController extends OCSController {
public function __construct(
string $appName,
IRequest $request,
private CircleService $circleService,
private MemberService $memberService,
private FederatedUserService $federatedUserService,
private ConfigService $configService,
private IUserSession $userSession,
private FileSharingTeamResourceProvider $resourceProvider,
private IURLGenerator $urlGenerator,
private ModelManager $modelManager,
private LoggerInterface $logger,
) {
parent::__construct($appName, $request);
}
/**
* @NoAdminRequired
*
* @param int $limit
* @param int $offset
*
* @return DataResponse
* @throws OCSException
*/
public function getCompleteTeamsData(int $limit = 3, int $offset = 0): DataResponse {
try {
$this->setCurrentFederatedUser();
$probe = new CircleProbe();
$probe->filterHiddenCircles()
->filterBackendCircles()
->setItemsLimit($limit)
->setItemsOffset($offset);
$circles = $this->circleService->probeCircles($probe);
$teams = [];
foreach ($circles as $circle) {
$members = [];
try {
$circleMembers = $this->memberService->getMembers($circle->getSingleId(), false);
// Limit to 5 members for the dashboard widget
$limitedMembers = array_slice($circleMembers, 0, 5);
foreach ($limitedMembers as $member) {
$members[] = [
'singleId' => $member->getSingleId(),
'userId' => $member->getUserId(),
'displayName' => $member->getDisplayName(),
'type' => $member->getUserType(),
];
}
} catch (\Exception $e) {
// Skip members if we can't fetch them
}
$resources = [];
try {
// Create TeamResourceService instance and fetch real resources
$resourceService = new TeamResourceService(
$this->resourceProvider,
$this->urlGenerator,
$this->logger
);
$resources = $resourceService->getAllTeamResources($circle->getSingleId());
} catch (\Exception $e) {
$this->logger->warning('Failed to fetch resources for circle ' . $circle->getSingleId() . ': ' . $e->getMessage());
}
$teams[] = [
'singleId' => $circle->getSingleId(),
'displayName' => $circle->getDisplayName(),
'name' => $circle->getName(),
'url' => $this->modelManager->generateLinkToCircle($circle->getSingleId()),
'members' => $members,
'resources' => $resources,
];
}
return new DataResponse($teams);
} catch (\Exception $e) {
throw new OCSException($e->getMessage(), (int)$e->getCode());
}
}
/**
* @return void
* @throws FrontendException
*/
private function setCurrentFederatedUser(): void {
if (!$this->configService->getAppValueBool(ConfigService::FRONTEND_ENABLED)) {
throw new FrontendException('frontend disabled');
}
$user = $this->userSession->getUser();
$this->federatedUserService->setLocalCurrentUser($user);
}
}