import { Injectable, Inject } from '@nestjs/common'; import { AllRacesPageViewModel, RaceStatsDto, ImportRaceResultsInput, ImportRaceResultsSummaryViewModel } from './dto/RaceDto'; // Core imports import type { Logger } from '@core/shared/application/Logger'; // Use cases import { GetAllRacesUseCase } from '@core/racing/application/use-cases/GetAllRacesUseCase'; import { GetTotalRacesUseCase } from '@core/racing/application/use-cases/GetTotalRacesUseCase'; import { ImportRaceResultsApiUseCase } from '@core/racing/application/use-cases/ImportRaceResultsApiUseCase'; // Presenters import { GetAllRacesPresenter } from './presenters/GetAllRacesPresenter'; import { GetTotalRacesPresenter } from './presenters/GetTotalRacesPresenter'; import { ImportRaceResultsApiPresenter } from './presenters/ImportRaceResultsApiPresenter'; // Tokens import { LOGGER_TOKEN } from './RaceProviders'; @Injectable() export class RaceService { constructor( private readonly getAllRacesUseCase: GetAllRacesUseCase, private readonly getTotalRacesUseCase: GetTotalRacesUseCase, private readonly importRaceResultsApiUseCase: ImportRaceResultsApiUseCase, @Inject(LOGGER_TOKEN) private readonly logger: Logger, ) {} async getAllRaces(): Promise { this.logger.debug('[RaceService] Fetching all races.'); const presenter = new GetAllRacesPresenter(); await this.getAllRacesUseCase.execute({}, presenter); return presenter.getViewModel()!; } async getTotalRaces(): Promise { this.logger.debug('[RaceService] Fetching total races count.'); const presenter = new GetTotalRacesPresenter(); await this.getTotalRacesUseCase.execute({}, presenter); return presenter.getViewModel()!; } async importRaceResults(input: ImportRaceResultsInput): Promise { this.logger.debug('Importing race results:', input); const presenter = new ImportRaceResultsApiPresenter(); await this.importRaceResultsApiUseCase.execute({ raceId: input.raceId, resultsFileContent: input.resultsFileContent }, presenter); return presenter.getViewModel()!; } }