import { DynamicModule, Module, Type } from '@nestjs/common'; import { CqrsModule } from '@nestjs/cqrs'; import { TRACKER_FACTORIES } from '@task-stream/api/tracker/domain'; import { ChangesService } from './changes.service'; import { COMMAND_HANDLERS } from './commands/command-handlers'; import { WriteAccess } from './commands/write-access'; import { IssueTree } from './commands/issue-tree'; import { CommentsService } from './comments.service'; import { EVENT_HANDLERS, ReadModelNotifier, } from './event-handlers/event-handlers'; import { IssuesService } from './issues.service'; import { ProjectsService } from './projects.service'; import { QUERY_HANDLERS } from './queries/query-handlers'; import { ReadAccess } from './queries/read-access'; import { ReleasesService } from './releases.service'; import { SAGAS } from './sagas/sagas'; import { WorkflowsService } from './workflows.service'; import { NotificationsService } from './notifications.service'; import { Notifier } from './notifications/notifier'; import { NotificationsEventHandler } from './notifications/notifications.event-handler'; import { GetMyNotificationSettingsQueryHandler, GetMyNotificationsQueryHandler, } from './notifications/notifications.queries'; import { MarkNotificationsReadCommandHandler, UpdateNotificationSettingsCommandHandler, } from './notifications/notifications.commands'; import { SAVED_FILTERS } from './saved-filters/saved-filters'; import { SavedFiltersService } from './saved-filters.service'; /** Notifications: derived from events, kept and dismissed per person. */ const NOTIFICATIONS = [ Notifier, NotificationsEventHandler, GetMyNotificationsQueryHandler, GetMyNotificationSettingsQueryHandler, MarkNotificationsReadCommandHandler, UpdateNotificationSettingsCommandHandler, ]; const SERVICES = [ ProjectsService, IssuesService, CommentsService, ReleasesService, ChangesService, WorkflowsService, NotificationsService, SavedFiltersService, ]; /** * Use cases of the tracker context. The infrastructure module implementing * its ports (lookups, read model, change feed, user directory) is plugged in * by the composition root; the event store comes from the SharedModule. */ @Module({ imports: [CqrsModule], providers: [ ...SERVICES, ...TRACKER_FACTORIES, WriteAccess, IssueTree, ReadAccess, ReadModelNotifier, ...COMMAND_HANDLERS, ...QUERY_HANDLERS, ...EVENT_HANDLERS, ...SAGAS, ...NOTIFICATIONS, ...SAVED_FILTERS, ], exports: SERVICES, }) export class TrackerApplicationModule { static withInfrastructure( infrastructureModule: Type | DynamicModule, ): DynamicModule { return { module: TrackerApplicationModule, imports: [infrastructureModule], }; } }