From 5d0164281376a78189c21a1e6b928df080f0dbfe Mon Sep 17 00:00:00 2001 From: nfebe Date: Tue, 30 Sep 2025 14:04:22 +0100 Subject: [PATCH] fix(unified-search): Remove hard-coded search result limit A change added in https://github.com/nextcloud/server/pull/45317 introduced a hard stop (25) that prevents full search results from showing up. If there are more than 25 search results for a query only 25 can be seen. So two main issues: - Only 25 results can be seen in total no matter what. - Breaks web client pagination, which typically adds 5 results per request. Signed-off-by: nfebe --- core/AppInfo/ConfigLexicon.php | 2 ++ core/Controller/UnifiedSearchController.php | 9 +++++++-- core/openapi-full.json | 2 +- core/openapi.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/AppInfo/ConfigLexicon.php b/core/AppInfo/ConfigLexicon.php index 8307acbc7eb..2c36a90770b 100644 --- a/core/AppInfo/ConfigLexicon.php +++ b/core/AppInfo/ConfigLexicon.php @@ -20,6 +20,7 @@ use NCU\Config\ValueType; */ class ConfigLexicon implements IConfigLexicon { public const UNIFIED_SEARCH_MIN_SEARCH_LENGTH = 'unified_search_min_search_length'; + public const UNIFIED_SEARCH_MAX_RESULTS_PER_REQUEST = 'unified_search_max_results_per_request'; public function getStrictness(): ConfigLexiconStrictness { return ConfigLexiconStrictness::IGNORE; @@ -28,6 +29,7 @@ class ConfigLexicon implements IConfigLexicon { public function getAppConfigs(): array { return [ new ConfigLexiconEntry(self::UNIFIED_SEARCH_MIN_SEARCH_LENGTH, ValueType::INT, 1, 'Minimum search length to trigger the request', lazy: false), + new ConfigLexiconEntry(self::UNIFIED_SEARCH_MAX_RESULTS_PER_REQUEST, ValueType::INT, 25, 'Maximum number of results returned per request', lazy: false), ]; } diff --git a/core/Controller/UnifiedSearchController.php b/core/Controller/UnifiedSearchController.php index 169c1f348dc..a8566f3b9a3 100644 --- a/core/Controller/UnifiedSearchController.php +++ b/core/Controller/UnifiedSearchController.php @@ -9,6 +9,8 @@ declare(strict_types=1); namespace OC\Core\Controller; use InvalidArgumentException; +use OC\Core\AppInfo\ConfigLexicon; +use OC\Core\Application; use OC\Core\ResponseDefinitions; use OC\Search\SearchComposer; use OC\Search\SearchQuery; @@ -19,6 +21,7 @@ use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; +use OCP\IAppConfig; use OCP\IL10N; use OCP\IRequest; use OCP\IURLGenerator; @@ -39,6 +42,7 @@ class UnifiedSearchController extends OCSController { private IRouter $router, private IURLGenerator $urlGenerator, private IL10N $l10n, + private IAppConfig $appConfig, ) { parent::__construct('core', $request); } @@ -72,7 +76,7 @@ class UnifiedSearchController extends OCSController { * @param string $providerId ID of the provider * @param string $term Term to search * @param int|null $sortOrder Order of entries - * @param int|null $limit Maximum amount of entries, limited to 25 + * @param int|null $limit Maximum amount of entries (capped by configurable unified-search.max-results-per-request, default: 25) * @param int|string|null $cursor Offset for searching * @param string $from The current user URL * @@ -96,7 +100,8 @@ class UnifiedSearchController extends OCSController { [$route, $routeParameters] = $this->getRouteInformation($from); $limit ??= SearchQuery::LIMIT_DEFAULT; - $limit = max(1, min($limit, 25)); + $maxLimit = $this->appConfig->getValueInt(Application::APP_ID, ConfigLexicon::UNIFIED_SEARCH_MAX_RESULTS_PER_REQUEST); + $limit = max(1, min($limit, $maxLimit)); try { $filters = $this->composer->buildFilterList($providerId, $this->request->getParams()); diff --git a/core/openapi-full.json b/core/openapi-full.json index b3284365898..006aad62ce9 100644 --- a/core/openapi-full.json +++ b/core/openapi-full.json @@ -7407,7 +7407,7 @@ { "name": "limit", "in": "query", - "description": "Maximum amount of entries, limited to 25", + "description": "Maximum amount of entries (capped by configurable unified-search.max-results-per-request, default: 25)", "schema": { "type": "integer", "format": "int64", diff --git a/core/openapi.json b/core/openapi.json index 1004bd541ca..5e514a7b266 100644 --- a/core/openapi.json +++ b/core/openapi.json @@ -7407,7 +7407,7 @@ { "name": "limit", "in": "query", - "description": "Maximum amount of entries, limited to 25", + "description": "Maximum amount of entries (capped by configurable unified-search.max-results-per-request, default: 25)", "schema": { "type": "integer", "format": "int64",