'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 { joinedAt: string; } const leagueMemberships = new Map(); /** * 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(); 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 };