import type { ITeamRepository } from '../../domain/repositories/ITeamRepository'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { GetTeamDetailsOutputPort } from '../ports/output/GetTeamDetailsOutputPort'; import { Result } from '@core/shared/application/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; /** * Use Case for retrieving team details. */ export class GetTeamDetailsUseCase { constructor( private readonly teamRepository: ITeamRepository, private readonly membershipRepository: ITeamMembershipRepository, ) {} async execute( params: { teamId: string; driverId: string }, ): Promise>> { try { const { teamId, driverId } = params; const team = await this.teamRepository.findById(teamId); if (!team) { return Result.err({ code: 'TEAM_NOT_FOUND', message: 'Team not found' }); } const membership = await this.membershipRepository.getMembership(teamId, driverId); const outputPort: GetTeamDetailsOutputPort = { team: { id: team.id, name: team.name.value, tag: team.tag?.value ?? '', description: team.description?.value ?? '', ownerId: team.ownerId, leagues: team.leagues.map(l => l), // assuming leagues are strings createdAt: team.createdAt instanceof Date ? team.createdAt : new Date(team.createdAt.value), }, membership: membership ? { role: membership.role as 'owner' | 'manager' | 'member', joinedAt: membership.joinedAt instanceof Date ? membership.joinedAt : new Date(membership.joinedAt), isActive: membership.status === 'active', } : null, canManage: membership ? membership.role === 'owner' || membership.role === 'manager' : false, }; return Result.ok(outputPort); } catch { return Result.err({ code: 'REPOSITORY_ERROR', message: 'Failed to fetch team details' }); } } }