A social knowledge tool for researchers built on ATProto
at ff03e09bfaf3b3baf2f90cdc6562677f0331ff67 66 lines 2.6 kB view raw
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}