Files
gridpilot.gg/packages/racing/infrastructure/repositories/InMemoryRaceEventRepository.ts
2025-12-13 11:43:09 +01:00

72 lines
2.0 KiB
TypeScript

/**
* In-memory implementation of IRaceEventRepository for development/testing.
*/
import type { IRaceEventRepository } from '../../domain/repositories/IRaceEventRepository';
import type { RaceEvent } from '../../domain/entities/RaceEvent';
export class InMemoryRaceEventRepository implements IRaceEventRepository {
private raceEvents: Map<string, RaceEvent> = new Map();
async findById(id: string): Promise<RaceEvent | null> {
return this.raceEvents.get(id) ?? null;
}
async findAll(): Promise<RaceEvent[]> {
return Array.from(this.raceEvents.values());
}
async findBySeasonId(seasonId: string): Promise<RaceEvent[]> {
return Array.from(this.raceEvents.values()).filter(
raceEvent => raceEvent.seasonId === seasonId
);
}
async findByLeagueId(leagueId: string): Promise<RaceEvent[]> {
return Array.from(this.raceEvents.values()).filter(
raceEvent => raceEvent.leagueId === leagueId
);
}
async findByStatus(status: string): Promise<RaceEvent[]> {
return Array.from(this.raceEvents.values()).filter(
raceEvent => raceEvent.status === status
);
}
async findAwaitingStewardingClose(): Promise<RaceEvent[]> {
const now = new Date();
return Array.from(this.raceEvents.values()).filter(
raceEvent =>
raceEvent.status === 'awaiting_stewarding' &&
raceEvent.stewardingClosesAt &&
raceEvent.stewardingClosesAt <= now
);
}
async create(raceEvent: RaceEvent): Promise<RaceEvent> {
this.raceEvents.set(raceEvent.id, raceEvent);
return raceEvent;
}
async update(raceEvent: RaceEvent): Promise<RaceEvent> {
this.raceEvents.set(raceEvent.id, raceEvent);
return raceEvent;
}
async delete(id: string): Promise<void> {
this.raceEvents.delete(id);
}
async exists(id: string): Promise<boolean> {
return this.raceEvents.has(id);
}
// Test helper methods
clear(): void {
this.raceEvents.clear();
}
getAll(): RaceEvent[] {
return Array.from(this.raceEvents.values());
}
}