From c53a1e7a8234e853d98c3b779b027b37b6ca6358 Mon Sep 17 00:00:00 2001 From: Vjacheslav Trushkin Date: Mon, 22 May 2023 08:57:19 +0300 Subject: [PATCH] feat: add min parameter to search query --- src/data/search/index.ts | 5 +++-- src/http/responses/search.ts | 9 +++++++++ src/types/search.ts | 1 + src/types/server/v2.ts | 4 +++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/data/search/index.ts b/src/data/search/index.ts index 2104f23..adf990a 100644 --- a/src/data/search/index.ts +++ b/src/data/search/index.ts @@ -69,6 +69,7 @@ export function search( return newItem; }; const limit = params.limit; + const softLimit = params.softLimit; interface ExtendedSearchKeywordsEntry extends SearchKeywordsEntry { // Add prefixes cache to avoid re-calculating it for every partial keyword @@ -256,9 +257,9 @@ export function search( // Extract results const results: string[] = []; const prefixes: Set = new Set(); - for (let i = 0; i < allMatches.length && results.length < limit; i++) { + for (let i = 0; i < allMatches.length && (softLimit || results.length < limit); i++) { const { names } = allMatches[i]; - for (let j = 0; j < names.length && results.length < limit; j++) { + for (let j = 0; j < names.length && (softLimit || results.length < limit); j++) { const name = names[j]; results.push(name); prefixes.add(name.split(':').shift() as string); diff --git a/src/http/responses/search.ts b/src/http/responses/search.ts index 07efb02..815014d 100644 --- a/src/http/responses/search.ts +++ b/src/http/responses/search.ts @@ -54,6 +54,15 @@ export function generateAPIv2SearchResponse(query: FastifyRequest['query'], res: } params.limit = Math.max(minSearchLimit, Math.min(limit, maxSearchLimit)); } + if (v2Query.min) { + const limit = parseInt(v2Query.min); + if (!limit) { + res.send(400); + return; + } + params.limit = Math.max(minSearchLimit, Math.min(limit, maxSearchLimit)); + params.softLimit = true; + } let start = 0; if (v2Query.start) { diff --git a/src/types/search.ts b/src/types/search.ts index caa1d4e..eac2393 100644 --- a/src/types/search.ts +++ b/src/types/search.ts @@ -50,6 +50,7 @@ export interface SearchParams { // Search results limit limit: number; + softLimit?: boolean; // True if limit can be exceeded // Toggle partial matches partial?: boolean; diff --git a/src/types/server/v2.ts b/src/types/server/v2.ts index da4b70b..1c4f1ee 100644 --- a/src/types/server/v2.ts +++ b/src/types/server/v2.ts @@ -103,7 +103,9 @@ export interface APIv2SearchParams extends APIv2CommonParams { query: SearchQuery; // Maximum number of items in response - limit?: number; + // If `min` is set, `limit` is ignored + limit?: number; // Hard limit. Number of results will not exceed `limit`. + min?: number; // Soft limit. Number of results can exceed `limit` if function already retrieved more icons. // Start index for results start?: number;