/** * Infrastructure Adapter: InMemoryLeagueRepository * * In-memory implementation of ILeagueRepository. * Stores data in Map structure with UUID generation. */ import { v4 as uuidv4 } from 'uuid'; import { League } from '@gridpilot/racing/domain/entities/League'; import type { ILeagueRepository } from '@gridpilot/racing/domain/repositories/ILeagueRepository'; export class InMemoryLeagueRepository implements ILeagueRepository { private leagues: Map; constructor(seedData?: League[]) { this.leagues = new Map(); if (seedData) { seedData.forEach(league => { this.leagues.set(league.id, league); }); } } async findById(id: string): Promise { return this.leagues.get(id) ?? null; } async findAll(): Promise { return Array.from(this.leagues.values()); } async findByOwnerId(ownerId: string): Promise { return Array.from(this.leagues.values()).filter( league => league.ownerId === ownerId ); } async create(league: League): Promise { if (await this.exists(league.id)) { throw new Error(`League with ID ${league.id} already exists`); } this.leagues.set(league.id, league); return league; } async update(league: League): Promise { if (!await this.exists(league.id)) { throw new Error(`League with ID ${league.id} not found`); } this.leagues.set(league.id, league); return league; } async delete(id: string): Promise { if (!await this.exists(id)) { throw new Error(`League with ID ${id} not found`); } this.leagues.delete(id); } async exists(id: string): Promise { return this.leagues.has(id); } async searchByName(query: string): Promise { const normalizedQuery = query.toLowerCase(); return Array.from(this.leagues.values()).filter(league => league.name.toLowerCase().includes(normalizedQuery) ); } /** * Utility method to generate a new UUID */ static generateId(): string { return uuidv4(); } }