mirror of
https://github.com/brendan-ch/project-inter-server.git
synced 2026-04-17 07:50:31 +00:00
Merge pull request #6 from brendan-ch/experimental/clear-repository-data-on-refresh
experimental/clear-repository-data-on-refresh
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { GetterSetterRepository } from "../repositories/GetterSetterRepository";
|
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 timeout = 10000;
|
||||||
const systemIdsToSupport = ["263"];
|
const systemIdsToSupport = ["263"];
|
||||||
@@ -9,7 +9,6 @@ const baseUrl = "https://passiogo.com/mapGetData.php";
|
|||||||
// Have one repository data loader running for each supported system
|
// Have one repository data loader running for each supported system
|
||||||
// Each data loader independently updates data based on frequency of usage
|
// 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
|
// Notes on this: we only need to reload ETA data frequently
|
||||||
// Other data can be reloaded periodically
|
// Other data can be reloaded periodically
|
||||||
// Detailed list:
|
// Detailed list:
|
||||||
@@ -48,10 +47,15 @@ export class RepositoryDataLoader {
|
|||||||
if (!this.shouldBeRunning) return;
|
if (!this.shouldBeRunning) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
await this.repository.clearSystemData();
|
||||||
await this.fetchAndUpdateSystemData();
|
await this.fetchAndUpdateSystemData();
|
||||||
|
await this.repository.clearRouteData();
|
||||||
await this.fetchAndUpdateRouteDataForExistingSystems();
|
await this.fetchAndUpdateRouteDataForExistingSystems();
|
||||||
|
await this.repository.clearStopData();
|
||||||
await this.fetchAndUpdateStopAndPolylineDataForRoutesInExistingSystems();
|
await this.fetchAndUpdateStopAndPolylineDataForRoutesInExistingSystems();
|
||||||
|
await this.repository.clearShuttleData();
|
||||||
await this.fetchAndUpdateShuttleDataForExistingSystems();
|
await this.fetchAndUpdateShuttleDataForExistingSystems();
|
||||||
|
await this.repository.clearEtaData();
|
||||||
await this.fetchAndUpdateEtaDataForExistingOrderedStops();
|
await this.fetchAndUpdateEtaDataForExistingOrderedStops();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
@@ -196,27 +200,39 @@ export class RepositoryDataLoader {
|
|||||||
private async fetchAndUpdateEtaDataForExistingOrderedStops() {
|
private async fetchAndUpdateEtaDataForExistingOrderedStops() {
|
||||||
// TODO implement once I figure out how to associate ETA data with shuttles
|
// TODO implement once I figure out how to associate ETA data with shuttles
|
||||||
|
|
||||||
// const systems = await this.repository.getSystems();
|
const systems = await this.repository.getSystems()
|
||||||
// await Promise.all(systems.map(async (system: ISystem) => {
|
await Promise.all(systems.map(async (system: ISystem) => {
|
||||||
// const stops = await this.repository.getStopsBySystemId(system.id);
|
const stops = await this.repository.getStopsBySystemId(system.id);
|
||||||
//
|
await Promise.all(stops.map(async (stop) => {
|
||||||
// await Promise.all(stops.map(async (stop: IStop) => {
|
const params = {
|
||||||
// const orderedStops = await this.repository.getOrderedStopsByStopId(stop.id);
|
eta: "3",
|
||||||
//
|
stopIds: stop.id,
|
||||||
// await Promise.all(orderedStops.map(async (orderedStop) => {
|
};
|
||||||
// const params = {
|
|
||||||
// eta: "3",
|
const query = new URLSearchParams(params).toString();
|
||||||
// stopIds: stop.id,
|
const response = await fetch(`${baseUrl}?${query}`, {
|
||||||
// routeId: orderedStop.routeId,
|
method: "GET",
|
||||||
// position: orderedStop.position,
|
});
|
||||||
// };
|
const json = await response.json();
|
||||||
//
|
|
||||||
// // How to get shuttle ID?????????
|
if (json.ETAs && json.ETAs[stop.id]) {
|
||||||
// // API doesn't provide it
|
// Continue with the parsing
|
||||||
// // I might be cooked
|
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) {
|
private async updateStopDataForSystemAndApiResponse(system: ISystem, json: any) {
|
||||||
|
|||||||
@@ -18,4 +18,11 @@ export interface GetterSetterRepository extends GetterRepository {
|
|||||||
addOrUpdateStop(stop: IStop): Promise<void>;
|
addOrUpdateStop(stop: IStop): Promise<void>;
|
||||||
addOrUpdateOrderedStop(orderedStop: IOrderedStop): Promise<void>;
|
addOrUpdateOrderedStop(orderedStop: IOrderedStop): Promise<void>;
|
||||||
addOrUpdateEta(eta: IEta): 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>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,4 +147,28 @@ export class UnoptimizedInMemoryRepository implements GetterSetterRepository {
|
|||||||
this.etas.push(eta);
|
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 = [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -132,10 +132,10 @@ export const resolvers: Resolvers<ServerContext> = {
|
|||||||
Shuttle: {
|
Shuttle: {
|
||||||
eta: async (parent, args, contextValue, info) => {
|
eta: async (parent, args, contextValue, info) => {
|
||||||
if (!args.forStopId) return null;
|
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;
|
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;
|
if (stop === null) return null;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -149,14 +149,14 @@ export const resolvers: Resolvers<ServerContext> = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
etas: async (parent, args, contextValue, info) => {
|
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;
|
if (!etasForShuttle) return null;
|
||||||
|
|
||||||
const computedEtas = await Promise.all(etasForShuttle.map(async ({
|
const computedEtas = await Promise.all(etasForShuttle.map(async ({
|
||||||
secondsRemaining,
|
secondsRemaining,
|
||||||
stopId,
|
stopId,
|
||||||
}): Promise<Eta | null> => {
|
}): Promise<Eta | null> => {
|
||||||
const stop = await contextValue.apiBasedRepository.getStopById(stopId);
|
const stop = await contextValue.repository.getStopById(stopId);
|
||||||
if (stop === null) return null;
|
if (stop === null) return null;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user