aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/search.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared/search.ts')
-rw-r--r--packages/shared/search.ts50
1 files changed, 50 insertions, 0 deletions
diff --git a/packages/shared/search.ts b/packages/shared/search.ts
new file mode 100644
index 00000000..3bdf1ad1
--- /dev/null
+++ b/packages/shared/search.ts
@@ -0,0 +1,50 @@
+import { MeiliSearch, Index } from "meilisearch";
+import serverConfig from "./config";
+import { z } from "zod";
+
+export const zBookmarkIdxSchema = z.object({
+ id: z.string(),
+ userId: z.string(),
+ url: z.string().nullish(),
+ title: z.string().nullish(),
+ description: z.string().nullish(),
+ content: z.string().nullish(),
+ tags: z.array(z.string()).default([]),
+});
+
+export type ZBookmarkIdx = z.infer<typeof zBookmarkIdxSchema>;
+
+let searchClient: MeiliSearch | undefined;
+
+if (serverConfig.meilisearch) {
+ searchClient = new MeiliSearch({
+ host: serverConfig.meilisearch.address,
+ apiKey: serverConfig.meilisearch.key,
+ });
+}
+
+const BOOKMARKS_IDX_NAME = "bookmarks";
+
+let idxClient: Index<ZBookmarkIdx> | undefined;
+
+export async function getSearchIdxClient(): Promise<Index<ZBookmarkIdx> | null> {
+ if (idxClient) {
+ return idxClient;
+ }
+ if (!searchClient) {
+ return null;
+ }
+
+ const indicies = await searchClient.getIndexes();
+ let idxFound = indicies.results.find((i) => i.uid == BOOKMARKS_IDX_NAME);
+ if (!idxFound) {
+ const idx = await searchClient.createIndex(BOOKMARKS_IDX_NAME, {
+ primaryKey: "id",
+ });
+ await searchClient.waitForTask(idx.taskUid);
+ idxFound = await searchClient.getIndex<ZBookmarkIdx>(BOOKMARKS_IDX_NAME);
+ const taskId = await idxFound.updateFilterableAttributes(["id", "userId"]);
+ await searchClient.waitForTask(taskId.taskUid);
+ }
+ return idxFound;
+}