import type { ILeagueMembershipRepository, } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; import type { ILeagueRepository } from '@gridpilot/racing/domain/repositories/ILeagueRepository'; import type { LeagueMembership, MembershipRole, } from '@gridpilot/racing/domain/entities/LeagueMembership'; export interface TransferLeagueOwnershipCommandDTO { leagueId: string; currentOwnerId: string; newOwnerId: string; } export class TransferLeagueOwnershipUseCase { constructor( private readonly leagueRepository: ILeagueRepository, private readonly membershipRepository: ILeagueMembershipRepository ) {} async execute(command: TransferLeagueOwnershipCommandDTO): Promise { const { leagueId, currentOwnerId, newOwnerId } = command; const league = await this.leagueRepository.findById(leagueId); if (!league) { throw new Error('League not found'); } if (league.ownerId !== currentOwnerId) { throw new Error('Only the current owner can transfer ownership'); } const newOwnerMembership = await this.membershipRepository.getMembership(leagueId, newOwnerId); if (!newOwnerMembership || newOwnerMembership.status !== 'active') { throw new Error('New owner must be an active member of the league'); } const currentOwnerMembership = await this.membershipRepository.getMembership(leagueId, currentOwnerId); await this.membershipRepository.saveMembership({ ...newOwnerMembership, role: 'owner' as MembershipRole, }); if (currentOwnerMembership) { await this.membershipRepository.saveMembership({ ...currentOwnerMembership, role: 'admin' as MembershipRole, }); } const updatedLeague = league.update({ ownerId: newOwnerId }); await this.leagueRepository.update(updatedLeague); } }