aboutsummaryrefslogtreecommitdiffstats
path: root/packages/plugins-search-meilisearch
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-09-14 08:27:44 +0000
committerMohamed Bassem <me@mbassem.com>2025-09-14 08:42:58 +0000
commitbf5bf996c63cc3af92bc0f302ec37f7dbbc9e94a (patch)
tree24066b4d21a08f35387da3680ae1d549a6d82d08 /packages/plugins-search-meilisearch
parenta92ada7727b2596414aafe204e5001eb066569cb (diff)
downloadkarakeep-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.ts18
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,
});