aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/search.ts
blob: 5158f30f5869a7438ef9ed45e4514530c43fe96c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { z } from "zod";

import { PluginManager, PluginType } from "./plugins";

export const zBookmarkSearchDocument = z.object({
  id: z.string(),
  userId: z.string(),
  url: z.string().nullish(),
  title: z.string().nullish(),
  linkTitle: z.string().nullish(),
  description: z.string().nullish(),
  content: z.string().nullish(),
  metadata: z.string().nullish(),
  fileName: z.string().nullish(),
  createdAt: z.string().nullish(),
  note: z.string().nullish(),
  summary: z.string().nullish(),
  tags: z.array(z.string()).default([]),
  publisher: z.string().nullish(),
  author: z.string().nullish(),
  datePublished: z.date().nullish(),
  dateModified: z.date().nullish(),
});

export type BookmarkSearchDocument = z.infer<typeof zBookmarkSearchDocument>;

export interface SearchResult {
  id: string;
  score?: number;
}

export interface SearchOptions {
  // TODO: Make query, filter and sort strongly typed
  query: string;
  filter?: string[];
  limit?: number;
  offset?: number;
  sort?: string[];
}

export interface SearchResponse {
  hits: SearchResult[];
  totalHits: number;
  processingTimeMs: number;
}

export interface SearchIndexClient {
  addDocuments(documents: BookmarkSearchDocument[]): Promise<void>;
  deleteDocuments(ids: string[]): Promise<void>;
  search(options: SearchOptions): Promise<SearchResponse>;
  clearIndex(): Promise<void>;
}

export async function getSearchClient(): Promise<SearchIndexClient | null> {
  return PluginManager.getClient(PluginType.Search);
}