From c476ea504fa0ae40742027033ade1e1810d56c58 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sun, 22 Dec 2024 14:32:17 -0800 Subject: [PATCH] add unoptimized in memory repository --- src/unoptimizedInMemoryRepository.ts | 137 +++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/unoptimizedInMemoryRepository.ts diff --git a/src/unoptimizedInMemoryRepository.ts b/src/unoptimizedInMemoryRepository.ts new file mode 100644 index 0000000..0674a39 --- /dev/null +++ b/src/unoptimizedInMemoryRepository.ts @@ -0,0 +1,137 @@ +import { IEntityWithId, IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem, Repository } from "./repository"; + +/** + * An unoptimized in memory repository. + * (I would optimize it with actual data structures, but I'm + * switching to another data store later anyways) + */ +export class UnoptimizedInMemoryRepository implements Repository { + private systems: ISystem[] = []; + private stops: IStop[] = []; + private routes: IRoute[] = []; + private shuttles: IShuttle[] = []; + private etas: IEta[] = []; + private orderedStops: IOrderedStop[] = []; + + public async getSystems() { + return this.systems; + } + + public async getSystemById(systemId: string) { + return this.findEntityById(systemId, this.systems); + } + + public async getStopsBySystemId(systemId: string) { + return this.stops.filter(stop => stop.systemId === systemId); + } + + public async getStopById(stopId: string) { + return this.findEntityById(stopId, this.stops); + } + + public async getRoutesBySystemId(systemId: string) { + return this.routes.filter(route => route.systemId === systemId); + } + + public async getRouteById(routeId: string) { + return this.findEntityById(routeId, this.routes); + } + + public async getShuttlesBySystemId(systemId: string) { + return this.shuttles.filter(shuttle => shuttle.systemId === systemId); + } + + public async getShuttleById(shuttleId: string) { + return this.findEntityById(shuttleId, this.shuttles); + } + + public async getEtasForShuttleId(shuttleId: string) { + return this.etas.filter(eta => eta.shuttleId === shuttleId); + } + + public async getEtasForStopId(stopId: string) { + return this.etas.filter(eta => eta.stopId === stopId); + } + + public async getEtaForShuttleAndStopId(shuttleId: string, stopId: string) { + return this.findEntityByMatcher((value) => value.stopId === stopId && value.shuttleId === shuttleId, this.etas); + } + + public async getOrderedStopByRouteAndStopId(routeId: string, stopId: string) { + return this.findEntityByMatcher((value) => value.routeId === routeId && value.stopId === stopId, this.orderedStops) + } + + public async getOrderedStopsByStopId(stopId: string) { + return this.orderedStops.filter((value) => value.stopId === stopId); + } + + public async getOrderedStopsByRouteId(routeId: string) { + return this.orderedStops.filter((value) => value.routeId === routeId); + } + + private findEntityById(entityId: string, arrayToSearchIn: T[]) { + return this.findEntityByMatcher((value) => value.id === entityId, arrayToSearchIn); + } + + private findEntityByMatcher(callback: (value: T) => boolean, arrayToSearchIn: T[]): T | null { + const entity = arrayToSearchIn.find(callback); + if (!entity) { + return null; + } + return entity; + } + + public async addOrUpdateSystem(system: ISystem): Promise { + const index = this.systems.findIndex((s) => s.id === system.id); + if (index !== -1) { + this.systems[index] = system; // Update existing + } else { + this.systems.push(system); // Add new + } + } + + public async addOrUpdateRoute(route: IRoute): Promise { + const index = this.routes.findIndex((r) => r.id === route.id); + if (index !== -1) { + this.routes[index] = route; + } else { + this.routes.push(route); + } + } + + public async addOrUpdateShuttle(shuttle: IShuttle): Promise { + const index = this.shuttles.findIndex((s) => s.id === shuttle.id); + if (index !== -1) { + this.shuttles[index] = shuttle; + } else { + this.shuttles.push(shuttle); + } + } + + public async addOrUpdateStop(stop: IStop): Promise { + const index = this.stops.findIndex((s) => s.id === stop.id); + if (index !== -1) { + this.stops[index] = stop; + } else { + this.stops.push(stop); + } + } + + public async addOrUpdateOrderedStop(orderedStop: IOrderedStop): Promise { + const index = this.orderedStops.findIndex((value) => value.stopId === orderedStop.stopId && value.routeId === orderedStop.routeId); + if (index !== -1) { + this.orderedStops[index] = orderedStop; + } else { + this.orderedStops.push(orderedStop); + } + } + + public async addOrUpdateEta(eta: IEta): Promise { + const index = this.etas.findIndex((e) => e.id === eta.id); + if (index !== -1) { + this.etas[index] = eta; + } else { + this.etas.push(eta); + } + } +} \ No newline at end of file