This commit is contained in:
2025-12-17 00:33:13 +01:00
parent 8c67081953
commit f01e01e50c
186 changed files with 9242 additions and 1342 deletions

View File

@@ -1,33 +1,42 @@
/**
* Domain Entity: LeagueMembership and JoinRequest
* Domain Entity: LeagueMembership
*
* Represents a driver's membership in a league and join requests.
* Represents a driver's membership in a league.
*/
import type { IEntity } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export type MembershipRole = 'owner' | 'admin' | 'steward' | 'member';
export type MembershipStatus = 'active' | 'inactive' | 'pending';
import { LeagueId } from './LeagueId';
import { DriverId } from '../value-objects/DriverId';
import { MembershipRole, MembershipRoleValue } from './MembershipRole';
import { MembershipStatus, MembershipStatusValue } from './MembershipStatus';
import { JoinedAt } from '../value-objects/JoinedAt';
export interface LeagueMembershipProps {
id?: string;
leagueId: string;
driverId: string;
role: MembershipRole;
status?: MembershipStatus;
role: string;
status?: string;
joinedAt?: Date;
}
export class LeagueMembership implements IEntity<string> {
readonly id: string;
readonly leagueId: string;
readonly driverId: string;
readonly leagueId: LeagueId;
readonly driverId: DriverId;
readonly role: MembershipRole;
readonly status: MembershipStatus;
readonly joinedAt: Date;
readonly joinedAt: JoinedAt;
private constructor(props: Required<LeagueMembershipProps>) {
private constructor(props: {
id: string;
leagueId: LeagueId;
driverId: DriverId;
role: MembershipRole;
status: MembershipStatus;
joinedAt: JoinedAt;
}) {
this.id = props.id;
this.leagueId = props.leagueId;
this.driverId = props.driverId;
@@ -44,14 +53,17 @@ export class LeagueMembership implements IEntity<string> {
? props.id
: `${props.leagueId}:${props.driverId}`;
const status = props.status ?? 'pending';
const joinedAt = props.joinedAt ?? new Date();
const leagueId = LeagueId.create(props.leagueId);
const driverId = DriverId.create(props.driverId);
const role = MembershipRole.create(props.role as MembershipRoleValue);
const status = MembershipStatus.create((props.status ?? 'pending') as MembershipStatusValue);
const joinedAt = JoinedAt.create(props.joinedAt ?? new Date());
return new LeagueMembership({
id,
leagueId: props.leagueId,
driverId: props.driverId,
role: props.role,
leagueId,
driverId,
role,
status,
joinedAt,
});
@@ -70,12 +82,4 @@ export class LeagueMembership implements IEntity<string> {
throw new RacingDomainValidationError('Membership role is required');
}
}
}
export interface JoinRequest {
id: string;
leagueId: string;
driverId: string;
requestedAt: Date;
message?: string;
}