From bf5bf996c63cc3af92bc0f302ec37f7dbbc9e94a Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 14 Sep 2025 08:27:44 +0000 Subject: refactor: strongly type the search plugin interface --- packages/plugins-search-meilisearch/src/index.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'packages/plugins-search-meilisearch/src') diff --git a/packages/plugins-search-meilisearch/src/index.ts b/packages/plugins-search-meilisearch/src/index.ts index d54fb6bc..77d5a57e 100644 --- a/packages/plugins-search-meilisearch/src/index.ts +++ b/packages/plugins-search-meilisearch/src/index.ts @@ -3,6 +3,7 @@ import { MeiliSearch } from "meilisearch"; import type { BookmarkSearchDocument, + FilterQuery, SearchIndexClient, SearchOptions, SearchResponse, @@ -11,6 +12,19 @@ import { PluginProvider } from "@karakeep/shared/plugins"; import { envConfig } from "./env"; +function filterToMeiliSearchFilter(filter: FilterQuery): string { + switch (filter.type) { + case "eq": + return `${filter.field} = "${filter.value}"`; + case "in": + return `${filter.field} IN [${filter.values.join(",")}]`; + default: { + const exhaustiveCheck: never = filter; + throw new Error(`Unhandled color case: ${exhaustiveCheck}`); + } + } +} + class MeiliSearchIndexClient implements SearchIndexClient { constructor(private index: Index) {} @@ -28,10 +42,10 @@ class MeiliSearchIndexClient implements SearchIndexClient { async search(options: SearchOptions): Promise { const result = await this.index.search(options.query, { - filter: options.filter, + filter: options.filter?.map((f) => filterToMeiliSearchFilter(f)), limit: options.limit, offset: options.offset, - sort: options.sort, + sort: options.sort?.map((s) => `${s.field}:${s.order}`), attributesToRetrieve: ["id"], showRankingScore: true, }); -- cgit v1.2.3-70-g09d2