import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { ISeasonRepository } from '../../domain/repositories/ISeasonRepository'; import type { ILeagueScoringConfigRepository } from '../../domain/repositories/ILeagueScoringConfigRepository'; import type { IGameRepository } from '../../domain/repositories/IGameRepository'; import type { ILeagueFullConfigPresenter, LeagueFullConfigData } from '../presenters/ILeagueFullConfigPresenter'; /** * Use Case for retrieving a league's full configuration. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetLeagueFullConfigUseCase { constructor( private readonly leagueRepository: ILeagueRepository, private readonly seasonRepository: ISeasonRepository, private readonly leagueScoringConfigRepository: ILeagueScoringConfigRepository, private readonly gameRepository: IGameRepository, public readonly presenter: ILeagueFullConfigPresenter, ) {} async execute(params: { leagueId: string }): Promise { const { leagueId } = params; const league = await this.leagueRepository.findById(leagueId); if (!league) { throw new Error(`League ${leagueId} not found`); } const seasons = await this.seasonRepository.findByLeagueId(leagueId); const activeSeason = seasons && seasons.length > 0 ? seasons.find((s) => s.status === 'active') ?? seasons[0] : undefined; let scoringConfig; let game; if (activeSeason) { scoringConfig = await this.leagueScoringConfigRepository.findBySeasonId(activeSeason.id); if (activeSeason.gameId) { game = await this.gameRepository.findById(activeSeason.gameId); } } const data: LeagueFullConfigData = { league, activeSeason, scoringConfig, game, }; this.presenter.present(data); } }