import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { IDriverRepository } from '../../domain/repositories/IDriverRepository'; import type { IImageServicePort } from '../ports/IImageServicePort'; import type { ITeamJoinRequestsPresenter, TeamJoinRequestsResultDTO, TeamJoinRequestsViewModel, } from '../presenters/ITeamJoinRequestsPresenter'; import type { UseCase } from '@core/shared/application'; import type { Logger } from '@core/shared/application'; /** * Use Case for retrieving team join requests. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetTeamJoinRequestsUseCase implements UseCase<{ teamId: string }, TeamJoinRequestsResultDTO, TeamJoinRequestsViewModel, ITeamJoinRequestsPresenter> { constructor( private readonly membershipRepository: ITeamMembershipRepository, private readonly driverRepository: IDriverRepository, private readonly imageService: IImageServicePort, private readonly logger: Logger, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: ITeamJoinRequestsPresenter, ) {} async execute(input: { teamId: string }, presenter: ITeamJoinRequestsPresenter): Promise { this.logger.debug('Executing GetTeamJoinRequestsUseCase', { teamId: input.teamId }); presenter.reset(); try { const requests = await this.membershipRepository.getJoinRequests(input.teamId); this.logger.info('Successfully retrieved team join requests', { teamId: input.teamId, count: requests.length }); const driverNames: Record = {}; const avatarUrls: Record = {}; for (const request of requests) { const driver = await this.driverRepository.findById(request.driverId); if (driver) { driverNames[request.driverId] = driver.name; } else { this.logger.warn(`Driver not found for ID: ${request.driverId} during join request processing.`); } avatarUrls[request.driverId] = this.imageService.getDriverAvatar(request.driverId); this.logger.debug('Processed driver details for join request', { driverId: request.driverId }); } const dto: TeamJoinRequestsResultDTO = { requests, driverNames, avatarUrls, }; presenter.present(dto); } catch (error) { this.logger.error('Error retrieving team join requests', { teamId: input.teamId, error }); throw error; } } }