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/feeds/application/eventHandlers/CardAddedToLibraryEventHandler';
8import { CardAddedToCollectionEventHandler } from '../../../modules/feeds/application/eventHandlers/CardAddedToCollectionEventHandler';
9import { CardCollectionSaga } from '../../../modules/feeds/application/sagas/CardCollectionSaga';
10import { RedisSagaStateStore } from '../../../modules/feeds/infrastructure/RedisSagaStateStore';
11import { InMemorySagaStateStore } from '../../../modules/feeds/infrastructure/InMemorySagaStateStore';
12import { QueueNames } from '../events/QueueConfig';
13import { EventNames } from '../events/EventConfig';
14import { BaseWorkerProcess } from './BaseWorkerProcess';
15import { IEventSubscriber } from '../../application/events/IEventSubscriber';
16import { Repositories } from '../http/factories/RepositoryFactory';
17
18export class FeedWorkerProcess extends BaseWorkerProcess {
19 constructor(configService: EnvironmentConfigService) {
20 super(configService, QueueNames.FEEDS);
21 }
22
23 protected createServices(repositories: Repositories): WorkerServices {
24 return ServiceFactory.createForWorker(this.configService, repositories);
25 }
26
27 protected async validateDependencies(
28 services: WorkerServices,
29 ): Promise<void> {
30 if (!services.redisConnection) {
31 throw new Error('Redis connection required for feed worker');
32 }
33 await services.redisConnection.ping();
34 }
35
36 protected async registerHandlers(
37 subscriber: IEventSubscriber,
38 services: WorkerServices,
39 repositories: Repositories,
40 ): Promise<void> {
41 const useCases = UseCaseFactory.createForWorker(repositories, services);
42
43 // Create saga with proper use case dependency and state store from services
44 const cardCollectionSaga = new CardCollectionSaga(
45 useCases.addActivityToFeedUseCase,
46 services.sagaStateStore,
47 );
48
49 const cardAddedToLibraryHandler = new CardAddedToLibraryEventHandler(
50 cardCollectionSaga,
51 );
52 const cardAddedToCollectionHandler = new CardAddedToCollectionEventHandler(
53 cardCollectionSaga,
54 );
55
56 await subscriber.subscribe(
57 EventNames.CARD_ADDED_TO_LIBRARY,
58 cardAddedToLibraryHandler,
59 );
60
61 await subscriber.subscribe(
62 EventNames.CARD_ADDED_TO_COLLECTION,
63 cardAddedToCollectionHandler,
64 );
65 }
66}