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'; export interface ApproveLeagueJoinRequestInput { leagueId: string; requestId: string; } export interface ApproveLeagueJoinRequestResult { success: boolean; message: string; } export class ApproveLeagueJoinRequestUseCase { constructor( private readonly leagueMembershipRepository: ILeagueMembershipRepository, private readonly output: UseCaseOutputPort, ) {} async execute( input: ApproveLeagueJoinRequestInput, ): 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: input.leagueId, driverId: request.driverId, role: 'member', status: 'active', joinedAt: JoinedAt.create(new Date()), }); const result: ApproveLeagueJoinRequestResult = { success: true, message: 'Join request approved.' }; this.output.present(result); return Result.ok(undefined); } }