import { Provider } from '@nestjs/common'; import { ProtestsService } from './ProtestsService'; // Import core interfaces import type { Logger } from '@core/shared/application/Logger'; // Import concrete in-memory implementations import { InMemoryProtestRepository } from '@adapters/racing/persistence/inmemory/InMemoryProtestRepository'; import { InMemoryRaceRepository } from '@adapters/racing/persistence/inmemory/InMemoryRaceRepository'; import { InMemoryLeagueMembershipRepository } from '@adapters/racing/persistence/inmemory/InMemoryLeagueMembershipRepository'; import { ConsoleLogger } from '@adapters/logging/ConsoleLogger'; // Import use cases import { ReviewProtestUseCase } from '@core/racing/application/use-cases/ReviewProtestUseCase'; // Import presenters import { ReviewProtestPresenter } from './presenters/ReviewProtestPresenter'; // Define injection tokens export const PROTEST_REPOSITORY_TOKEN = 'IProtestRepository'; export const RACE_REPOSITORY_TOKEN = 'IRaceRepository'; export const LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN = 'ILeagueMembershipRepository'; export const LOGGER_TOKEN = 'Logger'; export const REVIEW_PROTEST_PRESENTER_TOKEN = 'ReviewProtestPresenter'; export const ProtestsProviders: Provider[] = [ ProtestsService, // Provide the service itself { provide: PROTEST_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryProtestRepository(logger), inject: [LOGGER_TOKEN], }, { provide: RACE_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryRaceRepository(logger), inject: [LOGGER_TOKEN], }, { provide: LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, useFactory: (logger: Logger) => new InMemoryLeagueMembershipRepository(logger), inject: [LOGGER_TOKEN], }, { provide: LOGGER_TOKEN, useClass: ConsoleLogger, }, { provide: REVIEW_PROTEST_PRESENTER_TOKEN, useClass: ReviewProtestPresenter, }, // Use cases { provide: ReviewProtestUseCase, useFactory: ( protestRepo: any, raceRepo: any, leagueMembershipRepo: any, logger: Logger, output: ReviewProtestPresenter, ) => new ReviewProtestUseCase(protestRepo, raceRepo, leagueMembershipRepo, logger, output), inject: [ PROTEST_REPOSITORY_TOKEN, RACE_REPOSITORY_TOKEN, LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN, REVIEW_PROTEST_PRESENTER_TOKEN, ], }, ];