44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import type { ITeamRepository } from '../../domain/repositories/ITeamRepository';
|
|
import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository';
|
|
import type {
|
|
ITeamDetailsPresenter,
|
|
TeamDetailsResultDTO,
|
|
TeamDetailsViewModel,
|
|
} from '../presenters/ITeamDetailsPresenter';
|
|
import type { UseCase } from '@gridpilot/shared/application/UseCase';
|
|
|
|
/**
|
|
* Use Case for retrieving team details.
|
|
* Orchestrates domain logic and delegates presentation to the presenter.
|
|
*/
|
|
export class GetTeamDetailsUseCase
|
|
implements UseCase<{ teamId: string; driverId: string }, TeamDetailsResultDTO, TeamDetailsViewModel, ITeamDetailsPresenter>
|
|
{
|
|
constructor(
|
|
private readonly teamRepository: ITeamRepository,
|
|
private readonly membershipRepository: ITeamMembershipRepository,
|
|
) {}
|
|
|
|
async execute(
|
|
params: { teamId: string; driverId: string },
|
|
presenter: ITeamDetailsPresenter,
|
|
): Promise<void> {
|
|
presenter.reset();
|
|
|
|
const { teamId, driverId } = params;
|
|
const team = await this.teamRepository.findById(teamId);
|
|
if (!team) {
|
|
throw new Error('Team not found');
|
|
}
|
|
|
|
const membership = await this.membershipRepository.getMembership(teamId, driverId);
|
|
|
|
const dto: TeamDetailsResultDTO = {
|
|
team,
|
|
membership,
|
|
driverId,
|
|
};
|
|
|
|
presenter.present(dto);
|
|
}
|
|
} |