70 lines
3.5 KiB
TypeScript
70 lines
3.5 KiB
TypeScript
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<DriversLeaderboardViewModel> {
|
|
this.logger.debug('[DriverService] Fetching drivers leaderboard.');
|
|
|
|
const presenter = new DriversLeaderboardPresenter();
|
|
await this.getDriversLeaderboardUseCase.execute(undefined, presenter);
|
|
return presenter.viewModel;
|
|
}
|
|
|
|
async getTotalDrivers(): Promise<DriverStatsDto> {
|
|
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<CompleteOnboardingOutput> {
|
|
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<DriverRegistrationStatusViewModel> {
|
|
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;
|
|
}
|
|
}
|