51 lines
2.1 KiB
TypeScript
51 lines
2.1 KiB
TypeScript
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<AllRacesPageViewModel> {
|
|
this.logger.debug('[RaceService] Fetching all races.');
|
|
|
|
const presenter = new GetAllRacesPresenter();
|
|
await this.getAllRacesUseCase.execute({}, presenter);
|
|
return presenter.getViewModel()!;
|
|
}
|
|
|
|
async getTotalRaces(): Promise<RaceStatsDto> {
|
|
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<ImportRaceResultsSummaryViewModel> {
|
|
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()!;
|
|
}
|
|
}
|