import { Provider } from '@nestjs/common'; import { AnalyticsService } from './AnalyticsService'; import { RecordPageViewUseCase } from '@core/analytics/application/use-cases/RecordPageViewUseCase'; import { RecordEngagementUseCase } from '@core/analytics/application/use-cases/RecordEngagementUseCase'; import { GetDashboardDataUseCase } from '@core/analytics/application/use-cases/GetDashboardDataUseCase'; import { GetAnalyticsMetricsUseCase } from '@core/analytics/application/use-cases/GetAnalyticsMetricsUseCase'; import type { IPageViewRepository } from '@core/analytics/domain/repositories/IPageViewRepository'; import type { IEngagementRepository } from '@core/analytics/domain/repositories/IEngagementRepository'; import type { Logger } from '@core/shared/application'; const Logger_TOKEN = 'Logger_TOKEN'; const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN'; const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN'; const RECORD_PAGE_VIEW_USE_CASE_TOKEN = 'RecordPageViewUseCase_TOKEN'; const RECORD_ENGAGEMENT_USE_CASE_TOKEN = 'RecordEngagementUseCase_TOKEN'; const GET_DASHBOARD_DATA_USE_CASE_TOKEN = 'GetDashboardDataUseCase_TOKEN'; const GET_ANALYTICS_METRICS_USE_CASE_TOKEN = 'GetAnalyticsMetricsUseCase_TOKEN'; import { InMemoryEngagementRepository } from '@adapters/analytics/persistence/inmemory/InMemoryEngagementRepository'; import { InMemoryPageViewRepository } from '@adapters/analytics/persistence/inmemory/InMemoryPageViewRepository'; import { ConsoleLogger } from '@adapters/logging/ConsoleLogger'; export const AnalyticsProviders: Provider[] = [ AnalyticsService, { provide: Logger_TOKEN, useClass: ConsoleLogger, }, { provide: IPAGE_VIEW_REPO_TOKEN, useClass: InMemoryPageViewRepository, }, { provide: IENGAGEMENT_REPO_TOKEN, useClass: InMemoryEngagementRepository, }, { provide: RECORD_PAGE_VIEW_USE_CASE_TOKEN, useFactory: (repo: IPageViewRepository, logger: Logger) => new RecordPageViewUseCase(repo, logger), inject: [IPAGE_VIEW_REPO_TOKEN, Logger_TOKEN], }, { provide: RECORD_ENGAGEMENT_USE_CASE_TOKEN, useFactory: (repo: IEngagementRepository, logger: Logger) => new RecordEngagementUseCase(repo, logger), inject: [IENGAGEMENT_REPO_TOKEN, Logger_TOKEN], }, { provide: GET_DASHBOARD_DATA_USE_CASE_TOKEN, useFactory: (logger: Logger) => new GetDashboardDataUseCase(logger), inject: [Logger_TOKEN], }, { provide: GET_ANALYTICS_METRICS_USE_CASE_TOKEN, useFactory: (repo: IPageViewRepository, logger: Logger) => new GetAnalyticsMetricsUseCase(repo, logger), inject: [IPAGE_VIEW_REPO_TOKEN, Logger_TOKEN], }, ];