wip
This commit is contained in:
43
packages/racing/application/use-cases/JoinLeagueUseCase.ts
Normal file
43
packages/racing/application/use-cases/JoinLeagueUseCase.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user