import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import type { IApproveLeagueJoinRequestPresenter, ApproveLeagueJoinRequestResultDTO, ApproveLeagueJoinRequestViewModel } from '../presenters/IApproveLeagueJoinRequestPresenter'; import type { UseCase } from '@core/shared/application/UseCase'; export interface ApproveLeagueJoinRequestUseCaseParams { leagueId: string; requestId: string; } export interface ApproveLeagueJoinRequestResultDTO { success: boolean; message: string; } export class ApproveLeagueJoinRequestUseCase implements UseCase { constructor(private readonly leagueMembershipRepository: ILeagueMembershipRepository) {} async execute(params: ApproveLeagueJoinRequestUseCaseParams, presenter: IApproveLeagueJoinRequestPresenter): Promise { const requests = await this.leagueMembershipRepository.getJoinRequests(params.leagueId); const request = requests.find(r => r.id === params.requestId); if (!request) { throw new Error('Join request not found'); } await this.leagueMembershipRepository.removeJoinRequest(params.requestId); await this.leagueMembershipRepository.saveMembership({ leagueId: params.leagueId, driverId: request.driverId, role: 'member', status: 'active', joinedAt: new Date(), }); const dto: ApproveLeagueJoinRequestResultDTO = { success: true, message: 'Join request approved.' }; presenter.reset(); presenter.present(dto); } }