import type { TeamsApiClient } from '../../api/teams/TeamsApiClient'; import { TeamSummaryViewModel, TeamDetailsViewModel, TeamMemberViewModel } from '../../view-models'; // TODO: Move these types to apps/website/lib/types/generated when available type CreateTeamInputDto = { name: string; tag: string; description?: string }; type CreateTeamOutputDto = { id: string; success: boolean }; type UpdateTeamInputDto = { name?: string; tag?: string; description?: string }; type UpdateTeamOutputDto = { success: boolean }; type DriverTeamDto = { teamId: string; teamName: string; role: string }; type TeamSummaryDTO = { id: string; name: string; logoUrl?: string; memberCount: number; rating: number }; type TeamMemberDTO = { driverId: string; driver?: any; role: string; joinedAt: string }; /** * Team Service * * Orchestrates team operations by coordinating API calls and view model creation. * All dependencies are injected via constructor. */ export class TeamService { constructor( private readonly apiClient: TeamsApiClient ) {} /** * Get all teams with view model transformation */ async getAllTeams(): Promise { const dto = await this.apiClient.getAll(); return dto.teams.map((team: TeamSummaryDTO) => new TeamSummaryViewModel(team)); } /** * Get team details with view model transformation */ async getTeamDetails(teamId: string, currentUserId: string): Promise { const dto = await this.apiClient.getDetails(teamId); if (!dto) { return null; } return new TeamDetailsViewModel(dto, currentUserId); } /** * Get team members with view model transformation */ async getTeamMembers(teamId: string, currentUserId: string, teamOwnerId: string): Promise { const dto = await this.apiClient.getMembers(teamId); return dto.members.map((member: TeamMemberDTO) => new TeamMemberViewModel(member, currentUserId, teamOwnerId)); } /** * Create a new team */ async createTeam(input: CreateTeamInputDto): Promise { return await this.apiClient.create(input); } /** * Update team */ async updateTeam(teamId: string, input: UpdateTeamInputDto): Promise { return await this.apiClient.update(teamId, input); } /** * Get driver's team */ async getDriverTeam(driverId: string): Promise { return await this.apiClient.getDriverTeam(driverId); } }