diff --git a/src/loaders/RepositoryDataLoader.ts b/src/loaders/RepositoryDataLoader.ts index c4996f1..edcc831 100644 --- a/src/loaders/RepositoryDataLoader.ts +++ b/src/loaders/RepositoryDataLoader.ts @@ -1,5 +1,5 @@ import { GetterSetterRepository } from "../repositories/GetterSetterRepository"; -import { IRoute, IShuttle, IStop, ISystem } from "../entities/entities"; +import { IEta, IRoute, IShuttle, IStop, ISystem } from "../entities/entities"; const timeout = 10000; const systemIdsToSupport = ["263"]; @@ -9,7 +9,6 @@ const baseUrl = "https://passiogo.com/mapGetData.php"; // Have one repository data loader running for each supported system // Each data loader independently updates data based on frequency of usage -// TODO implement reloading of data // Notes on this: we only need to reload ETA data frequently // Other data can be reloaded periodically // Detailed list: @@ -48,10 +47,15 @@ export class RepositoryDataLoader { if (!this.shouldBeRunning) return; try { + await this.repository.clearSystemData(); await this.fetchAndUpdateSystemData(); + await this.repository.clearRouteData(); await this.fetchAndUpdateRouteDataForExistingSystems(); + await this.repository.clearStopData(); await this.fetchAndUpdateStopAndPolylineDataForRoutesInExistingSystems(); + await this.repository.clearShuttleData(); await this.fetchAndUpdateShuttleDataForExistingSystems(); + await this.repository.clearEtaData(); await this.fetchAndUpdateEtaDataForExistingOrderedStops(); } catch (e) { console.error(e); @@ -196,27 +200,39 @@ export class RepositoryDataLoader { private async fetchAndUpdateEtaDataForExistingOrderedStops() { // TODO implement once I figure out how to associate ETA data with shuttles - // const systems = await this.repository.getSystems(); - // await Promise.all(systems.map(async (system: ISystem) => { - // const stops = await this.repository.getStopsBySystemId(system.id); - // - // await Promise.all(stops.map(async (stop: IStop) => { - // const orderedStops = await this.repository.getOrderedStopsByStopId(stop.id); - // - // await Promise.all(orderedStops.map(async (orderedStop) => { - // const params = { - // eta: "3", - // stopIds: stop.id, - // routeId: orderedStop.routeId, - // position: orderedStop.position, - // }; - // - // // How to get shuttle ID????????? - // // API doesn't provide it - // // I might be cooked - // })); - // })); - // })); + const systems = await this.repository.getSystems() + await Promise.all(systems.map(async (system: ISystem) => { + const stops = await this.repository.getStopsBySystemId(system.id); + await Promise.all(stops.map(async (stop) => { + const params = { + eta: "3", + stopIds: stop.id, + }; + + const query = new URLSearchParams(params).toString(); + const response = await fetch(`${baseUrl}?${query}`, { + method: "GET", + }); + const json = await response.json(); + + if (json.ETAs && json.ETAs[stop.id]) { + // Continue with the parsing + json.ETAs[stop.id].forEach((jsonEta: any) => { + // Update cache + const shuttleId: string = jsonEta.busId; + + const eta: IEta = { + secondsRemaining: jsonEta.secondsSpent, + shuttleId: `${shuttleId}`, + stopId: stop.id, + millisecondsSinceEpoch: Date.now(), + }; + + this.repository.addOrUpdateEta(eta); + }); + } + })); + })) } private async updateStopDataForSystemAndApiResponse(system: ISystem, json: any) { diff --git a/src/repositories/GetterSetterRepository.ts b/src/repositories/GetterSetterRepository.ts index ce50567..ddcf68b 100644 --- a/src/repositories/GetterSetterRepository.ts +++ b/src/repositories/GetterSetterRepository.ts @@ -18,4 +18,11 @@ export interface GetterSetterRepository extends GetterRepository { addOrUpdateStop(stop: IStop): Promise; addOrUpdateOrderedStop(orderedStop: IOrderedStop): Promise; addOrUpdateEta(eta: IEta): Promise; + + clearSystemData(): Promise; + clearRouteData(): Promise; + clearShuttleData(): Promise; + clearStopData(): Promise; + clearOrderedStopData(): Promise; + clearEtaData(): Promise; } diff --git a/src/repositories/UnoptimizedInMemoryRepository.ts b/src/repositories/UnoptimizedInMemoryRepository.ts index e992531..c24a3c5 100644 --- a/src/repositories/UnoptimizedInMemoryRepository.ts +++ b/src/repositories/UnoptimizedInMemoryRepository.ts @@ -147,4 +147,28 @@ export class UnoptimizedInMemoryRepository implements GetterSetterRepository { this.etas.push(eta); } } + + public async clearSystemData() { + this.systems = []; + } + + public async clearShuttleData(): Promise { + this.shuttles = []; + } + + public async clearEtaData(): Promise { + this.etas = []; + } + + public async clearOrderedStopData(): Promise { + this.orderedStops = []; + } + + public async clearRouteData(): Promise { + this.routes = []; + } + + public async clearStopData(): Promise { + this.stops = []; + } } \ No newline at end of file diff --git a/src/resolvers.ts b/src/resolvers.ts index e6dc137..29cf156 100644 --- a/src/resolvers.ts +++ b/src/resolvers.ts @@ -132,10 +132,10 @@ export const resolvers: Resolvers = { Shuttle: { eta: async (parent, args, contextValue, info) => { if (!args.forStopId) return null; - const etaForStopId = await contextValue.apiBasedRepository.getEtaForShuttleAndStopId(parent.id, args.forStopId); + const etaForStopId = await contextValue.repository.getEtaForShuttleAndStopId(parent.id, args.forStopId); if (etaForStopId === null) return null; - const stop = await contextValue.apiBasedRepository.getStopById(etaForStopId.stopId); + const stop = await contextValue.repository.getStopById(etaForStopId.stopId); if (stop === null) return null; return { @@ -149,14 +149,14 @@ export const resolvers: Resolvers = { }; }, etas: async (parent, args, contextValue, info) => { - const etasForShuttle = await contextValue.apiBasedRepository.getEtasForShuttleId(parent.id); + const etasForShuttle = await contextValue.repository.getEtasForShuttleId(parent.id); if (!etasForShuttle) return null; const computedEtas = await Promise.all(etasForShuttle.map(async ({ secondsRemaining, stopId, }): Promise => { - const stop = await contextValue.apiBasedRepository.getStopById(stopId); + const stop = await contextValue.repository.getStopById(stopId); if (stop === null) return null; return {