Merge pull request #6 from brendan-ch/experimental/clear-repository-data-on-refresh

experimental/clear-repository-data-on-refresh
This commit is contained in:
2025-01-17 14:50:30 -08:00
committed by GitHub
4 changed files with 74 additions and 27 deletions

View File

@@ -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) {

View File

@@ -18,4 +18,11 @@ export interface GetterSetterRepository extends GetterRepository {
addOrUpdateStop(stop: IStop): Promise<void>;
addOrUpdateOrderedStop(orderedStop: IOrderedStop): Promise<void>;
addOrUpdateEta(eta: IEta): Promise<void>;
clearSystemData(): Promise<void>;
clearRouteData(): Promise<void>;
clearShuttleData(): Promise<void>;
clearStopData(): Promise<void>;
clearOrderedStopData(): Promise<void>;
clearEtaData(): Promise<void>;
}

View File

@@ -147,4 +147,28 @@ export class UnoptimizedInMemoryRepository implements GetterSetterRepository {
this.etas.push(eta);
}
}
public async clearSystemData() {
this.systems = [];
}
public async clearShuttleData(): Promise<void> {
this.shuttles = [];
}
public async clearEtaData(): Promise<void> {
this.etas = [];
}
public async clearOrderedStopData(): Promise<void> {
this.orderedStops = [];
}
public async clearRouteData(): Promise<void> {
this.routes = [];
}
public async clearStopData(): Promise<void> {
this.stops = [];
}
}

View File

@@ -132,10 +132,10 @@ export const resolvers: Resolvers<ServerContext> = {
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<ServerContext> = {
};
},
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<Eta | null> => {
const stop = await contextValue.apiBasedRepository.getStopById(stopId);
const stop = await contextValue.repository.getStopById(stopId);
if (stop === null) return null;
return {