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 as FeedCardAddedToLibraryEventHandler } from '../../../modules/feeds/application/eventHandlers/CardAddedToLibraryEventHandler';
8import { CardAddedToLibraryEventHandler as SearchCardAddedToLibraryEventHandler } from '../../../modules/search/application/eventHandlers/CardAddedToLibraryEventHandler';
9import { CardAddedToCollectionEventHandler } from '../../../modules/feeds/application/eventHandlers/CardAddedToCollectionEventHandler';
10import { CardCollectionSaga } from '../../../modules/feeds/application/sagas/CardCollectionSaga';
11import { EventNames } from '../events/EventConfig';
12import { IProcess } from '../../domain/IProcess';
13import { IEventSubscriber } from '../../application/events/IEventSubscriber';
14import {
15 RepositoryFactory,
16 Repositories,
17} from '../http/factories/RepositoryFactory';
18
19export class InMemoryEventWorkerProcess implements IProcess {
20 constructor(private configService: EnvironmentConfigService) {}
21
22 async start(): Promise<void> {
23 console.log('Starting in-memory event worker...');
24
25 const repositories = RepositoryFactory.create(this.configService);
26 const services = ServiceFactory.createForWorker(
27 this.configService,
28 repositories,
29 );
30
31 const eventSubscriber = services.createEventSubscriber('feeds'); // Queue name doesn't matter for in-memory
32 await this.registerHandlers(eventSubscriber, services, repositories);
33 await eventSubscriber.start();
34
35 console.log('In-memory event worker started');
36 }
37
38 private async registerHandlers(
39 subscriber: IEventSubscriber,
40 services: WorkerServices,
41 repositories: Repositories,
42 ): Promise<void> {
43 const useCases = UseCaseFactory.createForWorker(repositories, services);
44
45 // Feed handlers
46 const cardCollectionSaga = new CardCollectionSaga(
47 useCases.addActivityToFeedUseCase,
48 services.sagaStateStore,
49 );
50
51 const feedCardAddedToLibraryHandler =
52 new FeedCardAddedToLibraryEventHandler(cardCollectionSaga);
53 const cardAddedToCollectionHandler = new CardAddedToCollectionEventHandler(
54 cardCollectionSaga,
55 );
56
57 // Search handlers
58 const searchCardAddedToLibraryHandler =
59 new SearchCardAddedToLibraryEventHandler(
60 useCases.indexUrlForSearchUseCase,
61 repositories.cardRepository,
62 );
63
64 // Register feed handlers
65 await subscriber.subscribe(
66 EventNames.CARD_ADDED_TO_LIBRARY,
67 feedCardAddedToLibraryHandler,
68 );
69
70 await subscriber.subscribe(
71 EventNames.CARD_ADDED_TO_COLLECTION,
72 cardAddedToCollectionHandler,
73 );
74
75 // Register search handlers
76 await subscriber.subscribe(
77 EventNames.CARD_ADDED_TO_LIBRARY,
78 searchCardAddedToLibraryHandler,
79 );
80 }
81}