diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-09-14 08:27:44 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-09-14 08:42:58 +0000 |
| commit | bf5bf996c63cc3af92bc0f302ec37f7dbbc9e94a (patch) | |
| tree | 24066b4d21a08f35387da3680ae1d549a6d82d08 /packages/plugins-search-meilisearch | |
| parent | a92ada7727b2596414aafe204e5001eb066569cb (diff) | |
| download | karakeep-bf5bf996c63cc3af92bc0f302ec37f7dbbc9e94a.tar.zst | |
refactor: strongly type the search plugin interface
Diffstat (limited to 'packages/plugins-search-meilisearch')
| -rw-r--r-- | packages/plugins-search-meilisearch/src/index.ts | 18 |
1 files changed, 16 insertions, 2 deletions
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<BookmarkSearchDocument>) {} @@ -28,10 +42,10 @@ class MeiliSearchIndexClient implements SearchIndexClient { async search(options: SearchOptions): Promise<SearchResponse> { 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, }); |
