import { Injectable, Inject } from '@nestjs/common'; import { DriversLeaderboardViewModel, DriverStatsDto, CompleteOnboardingInput, CompleteOnboardingOutput, GetDriverRegistrationStatusQuery, DriverRegistrationStatusViewModel } from './dto/DriverDto'; // Use cases import { GetDriversLeaderboardUseCase } from '../../../../core/racing/application/use-cases/GetDriversLeaderboardUseCase'; import { GetTotalDriversUseCase } from '../../../../core/racing/application/use-cases/GetTotalDriversUseCase'; import { CompleteDriverOnboardingUseCase } from '../../../../core/racing/application/use-cases/CompleteDriverOnboardingUseCase'; import { IsDriverRegisteredForRaceUseCase } from '../../../../core/racing/application/use-cases/IsDriverRegisteredForRaceUseCase'; // Presenters import { DriversLeaderboardPresenter } from './presenters/DriversLeaderboardPresenter'; import { DriverStatsPresenter } from './presenters/DriverStatsPresenter'; import { CompleteOnboardingPresenter } from './presenters/CompleteOnboardingPresenter'; import { DriverRegistrationStatusPresenter } from './presenters/DriverRegistrationStatusPresenter'; // Tokens import { GET_DRIVERS_LEADERBOARD_USE_CASE_TOKEN, GET_TOTAL_DRIVERS_USE_CASE_TOKEN, COMPLETE_DRIVER_ONBOARDING_USE_CASE_TOKEN, IS_DRIVER_REGISTERED_FOR_RACE_USE_CASE_TOKEN, LOGGER_TOKEN } from './DriverProviders'; import { Logger } from '../../../../core/shared/logging/Logger'; @Injectable() export class DriverService { constructor( @Inject(GET_DRIVERS_LEADERBOARD_USE_CASE_TOKEN) private readonly getDriversLeaderboardUseCase: GetDriversLeaderboardUseCase, @Inject(GET_TOTAL_DRIVERS_USE_CASE_TOKEN) private readonly getTotalDriversUseCase: GetTotalDriversUseCase, @Inject(COMPLETE_DRIVER_ONBOARDING_USE_CASE_TOKEN) private readonly completeDriverOnboardingUseCase: CompleteDriverOnboardingUseCase, @Inject(IS_DRIVER_REGISTERED_FOR_RACE_USE_CASE_TOKEN) private readonly isDriverRegisteredForRaceUseCase: IsDriverRegisteredForRaceUseCase, @Inject(LOGGER_TOKEN) private readonly logger: Logger, ) {} async getDriversLeaderboard(): Promise { this.logger.debug('[DriverService] Fetching drivers leaderboard.'); const presenter = new DriversLeaderboardPresenter(); await this.getDriversLeaderboardUseCase.execute(undefined, presenter); return presenter.viewModel; } async getTotalDrivers(): Promise { this.logger.debug('[DriverService] Fetching total drivers count.'); const presenter = new DriverStatsPresenter(); await this.getTotalDriversUseCase.execute(undefined, presenter); return presenter.viewModel; } async completeOnboarding(userId: string, input: CompleteOnboardingInput): Promise { this.logger.debug('Completing onboarding for user:', userId); const presenter = new CompleteOnboardingPresenter(); await this.completeDriverOnboardingUseCase.execute({ userId, firstName: input.firstName, lastName: input.lastName, displayName: input.displayName, country: input.country, timezone: input.timezone, bio: input.bio, }, presenter); return presenter.viewModel; } async getDriverRegistrationStatus(query: GetDriverRegistrationStatusQuery): Promise { this.logger.debug('Checking driver registration status:', query); const presenter = new DriverRegistrationStatusPresenter(); await this.isDriverRegisteredForRaceUseCase.execute({ raceId: query.raceId, driverId: query.driverId }, presenter); return presenter.viewModel; } }