import type { ILeagueMembershipRepository, } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; import type { LeagueMembership, MembershipRole, MembershipStatus, } from '@gridpilot/racing/domain/entities/LeagueMembership'; export interface JoinLeagueCommand { leagueId: string; driverId: string; } export class JoinLeagueUseCase { constructor(private readonly membershipRepository: ILeagueMembershipRepository) {} /** * Joins a driver to a league as an active member. * * Mirrors the behavior of the legacy joinLeague function: * - Throws when membership already exists for this league/driver. * - Creates a new active membership with role "member" and current timestamp. */ async execute(command: JoinLeagueCommand): Promise { const { leagueId, driverId } = command; const existing = await this.membershipRepository.getMembership(leagueId, driverId); if (existing) { throw new Error('Already a member or have a pending request'); } const membership: LeagueMembership = { leagueId, driverId, role: 'member' as MembershipRole, status: 'active' as MembershipStatus, joinedAt: new Date(), }; return this.membershipRepository.saveMembership(membership); } }