This commit is contained in:
2025-12-04 11:54:42 +01:00
parent 9d5caa87f3
commit b7d5551ea7
223 changed files with 5473 additions and 885 deletions

View File

@@ -0,0 +1,43 @@
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<LeagueMembership> {
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);
}
}