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 '@core/shared/application'; import type { Team } from '../../domain/entities/Team'; import { Logger } from "@core/shared/application"; /** * 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, private readonly logger: Logger, ) {} async execute(_input: void, presenter: IAllTeamsPresenter): Promise { this.logger.debug('Executing GetAllTeamsUseCase'); presenter.reset(); try { const teams = await this.teamRepository.findAll(); if (teams.length === 0) { this.logger.warn('No teams found.'); } 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); this.logger.info('Successfully retrieved all teams.'); } catch (error) { this.logger.error('Error retrieving all teams:', error); throw error; // Re-throw the error after logging } } }