Review a search indexing handoff

src/search-handoff-types.tsTypeScript
@@ -0,0 +1,48 @@
1+export interface CatalogDocument {
2+ id: string;
3+ version: number;
4+ title: string;
5+ description: string;
6+}
7+
8+export interface IndexJob {
9+ id: string;
10+ entityId: string;
11+ version: number;
12+ document: CatalogDocument | null;
13+}
14+
15+export interface DatabaseTransaction {
16+ readonly transactionId: string;
17+}
18+
19+export interface CatalogRepository {
20+ save(document: CatalogDocument, transaction?: DatabaseTransaction): Promise<void>;
21+ delete(entityId: string, version: number, transaction?: DatabaseTransaction): Promise<void>;
22+}
23+
24+export interface IndexJobQueue {
25+ enqueue(job: IndexJob, transaction?: DatabaseTransaction): Promise<void>;
26+ claimBatch(ownerId: string, limit: number): Promise<IndexJob[]>;
27+ complete(jobId: string, ownerId: string): Promise<void>;
28+ releaseWithFailure(jobId: string, ownerId: string, message: string): Promise<void>;
29+}
30+
31+export interface SearchProvider {
32+ startWrite(input: {
33+ entityId: string;
34+ document: CatalogDocument | null;
35+ externalVersion?: number;
36+ }): Promise<{ acknowledgement: Promise<void> }>;
37+}
38+
39+export interface SearchHandoffDependencies {
40+ database: {
41+ transaction<T>(work: (transaction: DatabaseTransaction) => Promise<T>): Promise<T>;
42+ };
43+ repository: CatalogRepository;
44+ queue: IndexJobQueue;
45+ search: SearchProvider;
46+ ids: { next(): string };
47+ ownerId: string;
48+}