A social knowledge tool for researchers built on ATProto
1import { EnvironmentConfigService } from '../config/EnvironmentConfigService';
2import {
3 ServiceFactory,
4 WorkerServices,
5} from '../http/factories/ServiceFactory';
6import { UseCaseFactory } from '../http/factories/UseCaseFactory';
7import { CardAddedToLibraryEventHandler } from '../../../modules/search/application/eventHandlers/CardAddedToLibraryEventHandler';
8import { QueueNames } from '../events/QueueConfig';
9import { EventNames } from '../events/EventConfig';
10import { BaseWorkerProcess } from './BaseWorkerProcess';
11import { IEventSubscriber } from '../../application/events/IEventSubscriber';
12import { Repositories } from '../http/factories/RepositoryFactory';
13
14export class SearchWorkerProcess extends BaseWorkerProcess {
15 constructor(configService: EnvironmentConfigService) {
16 super(configService, QueueNames.SEARCH);
17 }
18
19 protected createServices(repositories: Repositories): WorkerServices {
20 return ServiceFactory.createForWorker(this.configService, repositories);
21 }
22
23 protected async validateDependencies(
24 services: WorkerServices,
25 ): Promise<void> {
26 if (!services.redisConnection) {
27 throw new Error('Redis connection required for search worker');
28 }
29 await services.redisConnection.ping();
30
31 // Validate search service (which includes vector database health check)
32 const searchHealthResult = await services.searchService.healthCheck();
33 if (searchHealthResult.isErr() || !searchHealthResult.value) {
34 throw new Error('Search service connection required for search worker');
35 }
36 }
37
38 protected async registerHandlers(
39 subscriber: IEventSubscriber,
40 services: WorkerServices,
41 repositories: Repositories,
42 ): Promise<void> {
43 const useCases = UseCaseFactory.createForWorker(repositories, services);
44
45 const cardAddedToLibraryHandler = new CardAddedToLibraryEventHandler(
46 useCases.indexUrlForSearchUseCase,
47 repositories.cardRepository,
48 );
49
50 await subscriber.subscribe(
51 EventNames.CARD_ADDED_TO_LIBRARY,
52 cardAddedToLibraryHandler,
53 );
54 }
55}