import type { ITeamRepository } from '../../domain/repositories/ITeamRepository'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { IAllTeamsPresenter, AllTeamsResultDTO, } from '../presenters/IAllTeamsPresenter'; import type { UseCase } from '@gridpilot/shared/application'; import type { Team } from '../../domain/entities/Team'; /** * Use Case for retrieving all teams. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetAllTeamsUseCase implements UseCase { constructor( private readonly teamRepository: ITeamRepository, private readonly teamMembershipRepository: ITeamMembershipRepository, ) {} async execute(_input: void, presenter: IAllTeamsPresenter): Promise { presenter.reset(); const teams = await this.teamRepository.findAll(); const enrichedTeams: AllTeamsResultDTO['teams'] = await Promise.all( teams.map(async (team) => { const memberCount = await this.teamMembershipRepository.countByTeamId(team.id); return { id: team.id, name: team.name, tag: team.tag, description: team.description, ownerId: team.ownerId, leagues: [...team.leagues], createdAt: team.createdAt, memberCount, }; }), ); const dto: AllTeamsResultDTO = { teams: enrichedTeams, }; presenter.present(dto); } }