diff --git a/core/AppInfo/ConfigLexicon.php b/core/AppInfo/ConfigLexicon.php index 8307acbc7eb1d..2c36a90770b1c 100644 --- a/core/AppInfo/ConfigLexicon.php +++ b/core/AppInfo/ConfigLexicon.php @@ -20,6 +20,7 @@ */ 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 @@ public function getStrictness(): ConfigLexiconStrictness { 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 169c1f348dc4b..a8566f3b9a3d6 100644 --- a/core/Controller/UnifiedSearchController.php +++ b/core/Controller/UnifiedSearchController.php @@ -9,6 +9,8 @@ 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\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 @@ public function __construct( private IRouter $router, private IURLGenerator $urlGenerator, private IL10N $l10n, + private IAppConfig $appConfig, ) { parent::__construct('core', $request); } @@ -72,7 +76,7 @@ public function getProviders(string $from = ''): DataResponse { * @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 @@ public function search( [$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 b328436589881..006aad62ce9f7 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 1004bd541ca3d..5e514a7b26603 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",