%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Collaboration/v2/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Collaboration/v2/CollaboratorSearchPlugin.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Collaboration\v2;
use Exception;
use OCA\Circles\AppInfo\Application;
use OCA\Circles\Model\Circle;
use OCA\Circles\Model\Probes\CircleProbe;
use OCA\Circles\Model\Probes\DataProbe;
use OCA\Circles\Service\CircleService;
use OCA\Circles\Service\FederatedUserService;
use OCA\Circles\Tools\Traits\TNCLogger;
use OCP\Collaboration\Collaborators\ISearchPlugin;
use OCP\Collaboration\Collaborators\ISearchResult;
use OCP\Collaboration\Collaborators\SearchResultType;
use OCP\IRequest;
use OCP\Share\IShare;
/**
* Class CollaboratorSearchPlugin
*
* @package OCA\Circles\Collaboration\v2
*/
class CollaboratorSearchPlugin implements ISearchPlugin {
use TNCLogger;
/** @var IRequest */
private $request;
/** @var FederatedUserService */
private $federatedUserService;
/** @var CircleService */
private $circleService;
/**
* CollaboratorSearchPlugin constructor.
*
* @param IRequest $request
* @param FederatedUserService $federatedUserService
* @param CircleService $circleService
*/
public function __construct(
IRequest $request,
FederatedUserService $federatedUserService,
CircleService $circleService
) {
$this->request = $request;
$this->federatedUserService = $federatedUserService;
$this->circleService = $circleService;
$this->setup('app', Application::APP_ID);
}
/**
* @param string $search
* @param int $limit
* @param int $offset
* @param ISearchResult $searchResult
*
* @return bool
*/
public function search($search, $limit, $offset, ISearchResult $searchResult): bool {
$wide = $exact = [];
$fromFrontEnd = true;
// TODO: remove this, using a cleaner way to detect the source of the request
$params = $this->request->getParams();
$shareType = $this->getArray('shareType', $params);
if (empty($shareType) || in_array(IShare::TYPE_ROOM, $shareType)) {
$fromFrontEnd = false;
}
$filterCircle = new Circle();
$filterCircle->setName($search)
->setDisplayName($search);
try {
$this->federatedUserService->initCurrentUser();
$probe = new CircleProbe();
$probe->filterBackendCircles()
->filterSystemCircles()
->setItemsLimit($limit)
->setItemsOffset($offset)
->setFilterCircle($filterCircle);
// If from the OCS API, we use getCircles(), to get more complex result at the price of huge resource,
// if not (ie. share popup) we only need probeCircles()
if ($fromFrontEnd) {
$probe->mustBeMember(false)
->filterConfig(Circle::CFG_ROOT, true);
$circles = $this->circleService->getCircles($probe);
} else {
$dataProbe = new DataProbe();
$dataProbe->add(DataProbe::OWNER);
$circles = $this->circleService->probeCircles($probe, $dataProbe);
}
} catch (Exception $e) {
return false;
}
foreach ($circles as $circle) {
$entry = $this->addResultEntry($circle);
if (strtolower($circle->getName()) === strtolower($search)) {
$exact[] = $entry;
} else {
$wide[] = $entry;
}
}
$type = new SearchResultType('circles');
$searchResult->addResultSet($type, $wide, $exact);
return false;
}
/**
* @param Circle $circle
*
* @return array
*/
private function addResultEntry(Circle $circle): array {
return [
'label' => $circle->getDisplayName(),
'shareWithDescription' => $this->circleService->getDefinition($circle),
'value' => [
'shareType' => IShare::TYPE_CIRCLE,
'shareWith' => $circle->getSingleId(),
'circle' => $circle
],
];
}
}