aboutsummaryrefslogtreecommitdiffstats
path: root/core/Controller/AutoCompleteController.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/Controller/AutoCompleteController.php')
-rw-r--r--core/Controller/AutoCompleteController.php114
1 files changed, 69 insertions, 45 deletions
diff --git a/core/Controller/AutoCompleteController.php b/core/Controller/AutoCompleteController.php
index f7174456731..692fe1b7297 100644
--- a/core/Controller/AutoCompleteController.php
+++ b/core/Controller/AutoCompleteController.php
@@ -3,62 +3,55 @@
declare(strict_types=1);
/**
- * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\Core\Controller;
+use OC\Core\ResponseDefinitions;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\ApiRoute;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
-use OCP\AppFramework\OCSController as Controller;
+use OCP\AppFramework\OCSController;
use OCP\Collaboration\AutoComplete\AutoCompleteEvent;
+use OCP\Collaboration\AutoComplete\AutoCompleteFilterEvent;
use OCP\Collaboration\AutoComplete\IManager;
use OCP\Collaboration\Collaborators\ISearch;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IRequest;
use OCP\Share\IShare;
-class AutoCompleteController extends Controller {
- private ISearch $collaboratorSearch;
- private IManager $autoCompleteManager;
- private IEventDispatcher $dispatcher;
-
- public function __construct(string $appName,
- IRequest $request,
- ISearch $collaboratorSearch,
- IManager $autoCompleteManager,
- IEventDispatcher $dispatcher) {
+/**
+ * @psalm-import-type CoreAutocompleteResult from ResponseDefinitions
+ */
+class AutoCompleteController extends OCSController {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ private ISearch $collaboratorSearch,
+ private IManager $autoCompleteManager,
+ private IEventDispatcher $dispatcher,
+ ) {
parent::__construct($appName, $request);
-
- $this->collaboratorSearch = $collaboratorSearch;
- $this->autoCompleteManager = $autoCompleteManager;
- $this->dispatcher = $dispatcher;
}
/**
- * @NoAdminRequired
+ * Autocomplete a query
+ *
+ * @param string $search Text to search for
+ * @param string|null $itemType Type of the items to search for
+ * @param string|null $itemId ID of the items to search for
* @param string|null $sorter can be piped, top prio first, e.g.: "commenters|share-recipients"
+ * @param list<int> $shareTypes Types of shares to search for
+ * @param int $limit Maximum number of results to return
+ *
+ * @return DataResponse<Http::STATUS_OK, list<CoreAutocompleteResult>, array{}>
+ *
+ * 200: Autocomplete results returned
*/
+ #[NoAdminRequired]
+ #[ApiRoute(verb: 'GET', url: '/autocomplete/get', root: '/core')]
public function get(string $search, ?string $itemType, ?string $itemId, ?string $sorter = null, array $shareTypes = [IShare::TYPE_USER], int $limit = 10): DataResponse {
// if enumeration/user listings are disabled, we'll receive an empty
// result from search() – thus nothing else to do here.
@@ -76,6 +69,18 @@ class AutoCompleteController extends Controller {
$this->dispatcher->dispatch(IManager::class . '::filterResults', $event);
$results = $event->getResults();
+ $event = new AutoCompleteFilterEvent(
+ $results,
+ $search,
+ $itemType,
+ $itemId,
+ $sorter,
+ $shareTypes,
+ $limit,
+ );
+ $this->dispatcher->dispatchTyped($event);
+ $results = $event->getResults();
+
$exactMatches = $results['exact'];
unset($results['exact']);
$results = array_merge_recursive($exactMatches, $results);
@@ -94,18 +99,37 @@ class AutoCompleteController extends Controller {
return new DataResponse($results);
}
+ /**
+ * @return list<CoreAutocompleteResult>
+ */
protected function prepareResultArray(array $results): array {
$output = [];
+ /** @var string $type */
foreach ($results as $type => $subResult) {
foreach ($subResult as $result) {
+ /** @var ?string $icon */
+ $icon = array_key_exists('icon', $result) ? $result['icon'] : null;
+
+ /** @var string $label */
+ $label = $result['label'];
+
+ /** @var ?string $subline */
+ $subline = array_key_exists('subline', $result) ? $result['subline'] : null;
+
+ /** @var ?array{status: string, message: ?string, icon: ?string, clearAt: ?int} $status */
+ $status = array_key_exists('status', $result) && is_array($result['status']) && !empty($result['status']) ? $result['status'] : null;
+
+ /** @var ?string $shareWithDisplayNameUnique */
+ $shareWithDisplayNameUnique = array_key_exists('shareWithDisplayNameUnique', $result) ? $result['shareWithDisplayNameUnique'] : null;
+
$output[] = [
- 'id' => (string) $result['value']['shareWith'],
- 'label' => $result['label'],
- 'icon' => $result['icon'] ?? '',
+ 'id' => (string)$result['value']['shareWith'],
+ 'label' => $label,
+ 'icon' => $icon ?? '',
'source' => $type,
- 'status' => $result['status'] ?? '',
- 'subline' => $result['subline'] ?? '',
- 'shareWithDisplayNameUnique' => $result['shareWithDisplayNameUnique'] ?? '',
+ 'status' => $status ?? '',
+ 'subline' => $subline ?? '',
+ 'shareWithDisplayNameUnique' => $shareWithDisplayNameUnique ?? '',
];
}
}