import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { IDriverRepository } from '../../domain/repositories/IDriverRepository'; import type { IImageServicePort } from '../ports/IImageServicePort'; import type { ITeamMembersPresenter, TeamMembersResultDTO, TeamMembersViewModel, } from '../presenters/ITeamMembersPresenter'; import type { UseCase } from '@gridpilot/shared/application'; /** * Use Case for retrieving team members. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetTeamMembersUseCase implements UseCase<{ teamId: string }, TeamMembersResultDTO, TeamMembersViewModel, ITeamMembersPresenter> { constructor( private readonly membershipRepository: ITeamMembershipRepository, private readonly driverRepository: IDriverRepository, private readonly imageService: IImageServicePort, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: ITeamMembersPresenter, ) {} async execute(input: { teamId: string }, presenter: ITeamMembersPresenter): Promise { presenter.reset(); const memberships = await this.membershipRepository.getTeamMembers(input.teamId); const driverNames: Record = {}; const avatarUrls: Record = {}; for (const membership of memberships) { const driver = await this.driverRepository.findById(membership.driverId); if (driver) { driverNames[membership.driverId] = driver.name; } avatarUrls[membership.driverId] = this.imageService.getDriverAvatar(membership.driverId); } const dto: TeamMembersResultDTO = { memberships, driverNames, avatarUrls, }; presenter.present(dto); } }