import { TeamDetailsViewModel } from '@/lib/view-models/TeamDetailsViewModel'; import { TeamMemberViewModel } from '@/lib/view-models/TeamMemberViewModel'; import { TeamSummaryViewModel } from '@/lib/view-models/TeamSummaryViewModel'; import { CreateTeamViewModel } from '@/lib/view-models/CreateTeamViewModel'; import { UpdateTeamViewModel } from '@/lib/view-models/UpdateTeamViewModel'; import { DriverTeamViewModel } from '@/lib/view-models/DriverTeamViewModel'; import type { TeamsApiClient } from '../../api/teams/TeamsApiClient'; // TODO: Move these types to apps/website/lib/types/generated when available type DriverDTO = { id: string; name: string; avatarUrl?: string; iracingId?: string; rating?: number }; 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?: DriverDTO; 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 with view model transformation */ async createTeam(input: CreateTeamInputDto): Promise { const dto = await this.apiClient.create(input); return new CreateTeamViewModel(dto); } /** * Update team with view model transformation */ async updateTeam(teamId: string, input: UpdateTeamInputDto): Promise { const dto = await this.apiClient.update(teamId, input); return new UpdateTeamViewModel(dto); } /** * Get driver's team with view model transformation */ async getDriverTeam(driverId: string): Promise { const dto = await this.apiClient.getDriverTeam(driverId); return dto ? new DriverTeamViewModel(dto) : null; } }