import type { ITeamRepository } from '../../domain/repositories/ITeamRepository'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { IDriverTeamPresenter, DriverTeamResultDTO, DriverTeamViewModel, } from '../presenters/IDriverTeamPresenter'; import type { UseCase } from '@gridpilot/shared/application'; import type { ILogger } from '../../../shared/src/logging/ILogger'; /** * Use Case for retrieving a driver's team. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetDriverTeamUseCase implements UseCase<{ driverId: string }, DriverTeamResultDTO, DriverTeamViewModel, IDriverTeamPresenter> { constructor( private readonly teamRepository: ITeamRepository, private readonly membershipRepository: ITeamMembershipRepository, private readonly logger: ILogger, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: IDriverTeamPresenter, ) {} async execute(input: { driverId: string }, presenter: IDriverTeamPresenter): Promise { this.logger.debug(`Executing GetDriverTeamUseCase for driverId: ${input.driverId}`); presenter.reset(); const membership = await this.membershipRepository.getActiveMembershipForDriver(input.driverId); if (!membership) { this.logger.warn(`No active membership found for driverId: ${input.driverId}`); return; } this.logger.debug(`Found membership for driverId: ${input.driverId}, teamId: ${membership.teamId}`); const team = await this.teamRepository.findById(membership.teamId); if (!team) { this.logger.error(`Team not found for teamId: ${membership.teamId}`); return; } this.logger.debug(`Found team for teamId: ${team.id}, name: ${team.name}`); const dto: DriverTeamResultDTO = { team, membership, driverId: input.driverId, }; presenter.present(dto); this.logger.info(`Successfully presented driver team for driverId: ${input.driverId}`); } }