39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import type {
|
|
ILeagueMembershipRepository,
|
|
} from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository';
|
|
import type {
|
|
LeagueMembership,
|
|
MembershipRole,
|
|
MembershipStatus,
|
|
} from '@gridpilot/racing/domain/entities/LeagueMembership';
|
|
import type { JoinLeagueCommandDTO } from '../dto/JoinLeagueCommandDTO';
|
|
|
|
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: JoinLeagueCommandDTO): 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);
|
|
}
|
|
} |