32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import type { ITeamRepository } from '../../domain/repositories/ITeamRepository';
|
|
import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository';
|
|
import type { IAllTeamsPresenter } from '../presenters/IAllTeamsPresenter';
|
|
|
|
/**
|
|
* Use Case for retrieving all teams.
|
|
* Orchestrates domain logic and delegates presentation to the presenter.
|
|
*/
|
|
export class GetAllTeamsUseCase {
|
|
constructor(
|
|
private readonly teamRepository: ITeamRepository,
|
|
private readonly teamMembershipRepository: ITeamMembershipRepository,
|
|
public readonly presenter: IAllTeamsPresenter,
|
|
) {}
|
|
|
|
async execute(): Promise<void> {
|
|
const teams = await this.teamRepository.findAll();
|
|
|
|
// Enrich teams with member counts
|
|
const enrichedTeams = await Promise.all(
|
|
teams.map(async (team) => {
|
|
const memberships = await this.teamMembershipRepository.findByTeamId(team.id);
|
|
return {
|
|
...team,
|
|
memberCount: memberships.length,
|
|
};
|
|
})
|
|
);
|
|
|
|
this.presenter.present(enrichedTeams as any);
|
|
}
|
|
} |