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+
}