36 lines
1.6 KiB
TypeScript
36 lines
1.6 KiB
TypeScript
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<ApproveLeagueJoinRequestUseCaseParams, ApproveLeagueJoinRequestResultDTO, ApproveLeagueJoinRequestViewModel, IApproveLeagueJoinRequestPresenter> {
|
|
constructor(private readonly leagueMembershipRepository: ILeagueMembershipRepository) {}
|
|
|
|
async execute(params: ApproveLeagueJoinRequestUseCaseParams, presenter: IApproveLeagueJoinRequestPresenter): Promise<void> {
|
|
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);
|
|
}
|
|
} |