import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import { Result } from '@core/shared/result/Result'; import { RacingDomainValidationError } from '../../domain/errors/RacingDomainError'; import type { AsyncUseCase } from '@core/shared/application'; import { randomUUID } from 'crypto'; import type { ApproveLeagueJoinRequestUseCaseParams } from './ApproveLeagueJoinRequestUseCaseParams'; import type { ApproveLeagueJoinRequestResultDTO } from '../dto/ApproveLeagueJoinRequestResultDTO'; export class ApproveLeagueJoinRequestUseCase implements AsyncUseCase> { constructor(private readonly leagueMembershipRepository: ILeagueMembershipRepository) {} async execute(params: ApproveLeagueJoinRequestUseCaseParams): Promise> { const requests = await this.leagueMembershipRepository.getJoinRequests(params.leagueId); const request = requests.find(r => r.id === params.requestId); if (!request) { return Result.err(new RacingDomainValidationError('Join request not found')); } await this.leagueMembershipRepository.removeJoinRequest(params.requestId); await this.leagueMembershipRepository.saveMembership({ id: randomUUID(), leagueId: params.leagueId, driverId: request.driverId, role: 'member', status: 'active', joinedAt: new Date(), }); const dto: ApproveLeagueJoinRequestResultDTO = { success: true, message: 'Join request approved.' }; return Result.ok(dto); } }