import type { ITeamRepository } from '../../domain/repositories/ITeamRepository'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { ITeamDetailsPresenter, TeamDetailsResultDTO, TeamDetailsViewModel, } from '../presenters/ITeamDetailsPresenter'; import type { UseCase } from '@gridpilot/shared/application/UseCase'; /** * Use Case for retrieving team details. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetTeamDetailsUseCase implements UseCase<{ teamId: string; driverId: string }, TeamDetailsResultDTO, TeamDetailsViewModel, ITeamDetailsPresenter> { constructor( private readonly teamRepository: ITeamRepository, private readonly membershipRepository: ITeamMembershipRepository, ) {} async execute( params: { teamId: string; driverId: string }, presenter: ITeamDetailsPresenter, ): Promise { presenter.reset(); const { teamId, driverId } = params; const team = await this.teamRepository.findById(teamId); if (!team) { throw new Error('Team not found'); } const membership = await this.membershipRepository.getMembership(teamId, driverId); const dto: TeamDetailsResultDTO = { team, membership, driverId, }; presenter.present(dto); } }