import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import { Result } from '@core/shared/application/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import { randomUUID } from 'crypto'; import type { UseCaseOutputPort } from '@core/shared/application/UseCaseOutputPort'; import { JoinedAt } from '../../domain/value-objects/JoinedAt'; import { LeagueId } from '../../domain/entities/LeagueId'; import { DriverId } from '../../domain/entities/DriverId'; import { MembershipRole } from '../../domain/entities/MembershipRole'; import { MembershipStatus } from '../../domain/entities/MembershipStatus'; export interface ApproveLeagueJoinRequestInput { leagueId: string; requestId: string; } export interface ApproveLeagueJoinRequestResult { success: boolean; message: string; } export class ApproveLeagueJoinRequestUseCase { constructor( private readonly leagueMembershipRepository: ILeagueMembershipRepository, ) {} async execute( input: ApproveLeagueJoinRequestInput, output: UseCaseOutputPort, ): Promise>> { const requests = await this.leagueMembershipRepository.getJoinRequests(input.leagueId); const request = requests.find(r => r.id === input.requestId); if (!request) { return Result.err({ code: 'JOIN_REQUEST_NOT_FOUND' }); } await this.leagueMembershipRepository.removeJoinRequest(input.requestId); await this.leagueMembershipRepository.saveMembership({ id: randomUUID(), leagueId: LeagueId.create(input.leagueId), driverId: DriverId.create(request.driverId.toString()), role: MembershipRole.create('member'), status: MembershipStatus.create('active'), joinedAt: JoinedAt.create(new Date()), }); const result: ApproveLeagueJoinRequestResult = { success: true, message: 'Join request approved.' }; output.present(result); return Result.ok(undefined); } }