import { ILeagueRepository } from '@core/racing/domain/repositories/ILeagueRepository'; import { League } from '@core/racing/domain/entities/League'; import { Logger } from '@core/shared/application'; export class InMemoryLeagueRepository implements ILeagueRepository { private leagues: Map = new Map(); constructor(private readonly logger: Logger, initialLeagues: League[] = []) { this.logger.info('InMemoryLeagueRepository initialized.'); for (const league of initialLeagues) { this.leagues.set(league.id, league); this.logger.debug(`Seeded league: ${league.id} (${league.name}).`); } } async findById(id: string): Promise { this.logger.debug(`[InMemoryLeagueRepository] Finding league by ID: ${id}`); const league = this.leagues.get(id) ?? null; if (league) { this.logger.info(`Found league by ID: ${id}.`); } else { this.logger.warn(`League with ID ${id} not found.`); } return Promise.resolve(league); } async findByOwnerId(ownerId: string): Promise { this.logger.debug(`[InMemoryLeagueRepository] Finding leagues by owner ID: ${ownerId}`); const ownedLeagues = Array.from(this.leagues.values()).filter(league => league.ownerId === ownerId); this.logger.info(`Found ${ownedLeagues.length} leagues for owner ID: ${ownerId}.`); return Promise.resolve(ownedLeagues); } async searchByName(name: string): Promise { this.logger.debug(`[InMemoryLeagueRepository] Searching leagues by name: ${name}`); const matchingLeagues = Array.from(this.leagues.values()).filter(league => league.name.toLowerCase().includes(name.toLowerCase()), ); this.logger.info(`Found ${matchingLeagues.length} matching leagues for name search: ${name}.`); return Promise.resolve(matchingLeagues); } async findAll(): Promise { this.logger.debug('[InMemoryLeagueRepository] Finding all leagues.'); return Promise.resolve(Array.from(this.leagues.values())); } async create(league: League): Promise { this.logger.debug(`[InMemoryLeagueRepository] Creating league: ${league.id} (${league.name})`); if (this.leagues.has(league.id)) { this.logger.warn(`League with ID ${league.id} already exists.`); throw new Error('League already exists'); } this.leagues.set(league.id, league); this.logger.info(`League ${league.id} created successfully.`); return Promise.resolve(league); } async update(league: League): Promise { this.logger.debug(`[InMemoryLeagueRepository] Updating league: ${league.id} (${league.name})`); if (!this.leagues.has(league.id)) { this.logger.warn(`League with ID ${league.id} not found for update.`); throw new Error('League not found'); } this.leagues.set(league.id, league); this.logger.info(`League ${league.id} updated successfully.`); return Promise.resolve(league); } async delete(id: string): Promise { this.logger.debug(`[InMemoryLeagueRepository] Deleting league with ID: ${id}`); if (this.leagues.delete(id)) { this.logger.info(`League ${id} deleted successfully.`); } else { this.logger.warn(`League with ID ${id} not found for deletion.`); } return Promise.resolve(); } async exists(id: string): Promise { this.logger.debug(`[InMemoryLeagueRepository] Checking existence of league with ID: ${id}`); return Promise.resolve(this.leagues.has(id)); } }