Files
gridpilot.gg/apps/website/lib/leagueMembership.ts
2025-12-04 23:31:55 +01:00

89 lines
2.5 KiB
TypeScript

'use client';
import type {
LeagueMembership as DomainLeagueMembership,
MembershipRole,
MembershipStatus,
} from '@gridpilot/racing/domain/entities/LeagueMembership';
import { leagues, memberships as seedMemberships } from '@gridpilot/testing-support';
/**
* Lightweight league membership model mirroring the domain type but with
* a stringified joinedAt for easier UI formatting.
*/
export interface LeagueMembership extends Omit<DomainLeagueMembership, 'joinedAt'> {
joinedAt: string;
}
const leagueMemberships = new Map<string, LeagueMembership[]>();
/**
* Initialize league memberships once from static seed data.
*
* - All seeded memberships become active members.
* - League owners are guaranteed to have an owner membership.
*/
(function initializeLeagueMembershipsFromSeed() {
if (leagueMemberships.size > 0) {
return;
}
const byLeague = new Map<string, LeagueMembership[]>();
for (const membership of seedMemberships) {
const list = byLeague.get(membership.leagueId) ?? [];
const joinedAt = new Date().toISOString();
list.push({
leagueId: membership.leagueId,
driverId: membership.driverId,
role: 'member',
status: 'active',
joinedAt,
});
byLeague.set(membership.leagueId, list);
}
for (const league of leagues) {
const list = byLeague.get(league.id) ?? [];
const existingOwner = list.find((m) => m.driverId === league.ownerId);
if (existingOwner) {
existingOwner.role = 'owner';
} else {
const joinedAt = new Date().toISOString();
list.unshift({
leagueId: league.id,
driverId: league.ownerId,
role: 'owner',
status: 'active',
joinedAt,
});
}
byLeague.set(league.id, list);
}
for (const [leagueId, list] of byLeague.entries()) {
leagueMemberships.set(leagueId, list);
}
})();
export function getMembership(leagueId: string, driverId: string): LeagueMembership | null {
const list = leagueMemberships.get(leagueId);
if (!list) return null;
return list.find((m) => m.driverId === driverId) ?? null;
}
export function getLeagueMembers(leagueId: string): LeagueMembership[] {
return [...(leagueMemberships.get(leagueId) ?? [])];
}
export function isOwnerOrAdmin(leagueId: string, driverId: string): boolean {
const membership = getMembership(leagueId, driverId);
if (!membership) return false;
return membership.role === 'owner' || membership.role === 'admin';
}
export type { MembershipRole, MembershipStatus };