mirror of
https://github.com/brendan-ch/project-inter-server.git
synced 2026-04-17 07:50:31 +00:00
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
import { GetterSetterRepository } from "../repositories/GetterSetterRepository";
|
|
import { IEta, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
|
|
import { ApiBasedRepositoryLoader } from "./ApiBasedRepositoryLoader";
|
|
|
|
// Ideas to break this into smaller pieces in the future:
|
|
// Have one repository data loader running for each supported system
|
|
// Each data loader independently updates data based on frequency of usage
|
|
|
|
// Notes on this: we only need to reload ETA data frequently
|
|
// Other data can be reloaded periodically
|
|
// Detailed list:
|
|
// - ETA: reload frequently or switch to write-through approach
|
|
// - Shuttles: reload every minute
|
|
// - Routes: reload every few minutes
|
|
// - Stops: reload every few minutes
|
|
// - OrderedStops: reload every few minutes
|
|
// - Systems: reload once a day
|
|
|
|
export class TimedApiBasedRepositoryLoader extends ApiBasedRepositoryLoader {
|
|
private shouldBeRunning: boolean = false;
|
|
private timer: any;
|
|
|
|
readonly timeout = 10000;
|
|
|
|
constructor(
|
|
repository: GetterSetterRepository,
|
|
) {
|
|
super(repository);
|
|
this.startFetchDataAndUpdate = this.startFetchDataAndUpdate.bind(this);
|
|
}
|
|
|
|
public async start() {
|
|
if (this.shouldBeRunning) {
|
|
console.warn("DataLoader timer is already running");
|
|
return;
|
|
}
|
|
|
|
this.shouldBeRunning = true;
|
|
await this.startFetchDataAndUpdate();
|
|
}
|
|
|
|
public stop() {
|
|
this.shouldBeRunning = false;
|
|
}
|
|
|
|
private async startFetchDataAndUpdate() {
|
|
if (!this.shouldBeRunning) return;
|
|
|
|
try {
|
|
await this.repository.clearSystemData();
|
|
await this.fetchAndUpdateSystemData();
|
|
await this.repository.clearRouteData();
|
|
await this.fetchAndUpdateRouteDataForExistingSystemsInRepository();
|
|
await this.repository.clearStopData();
|
|
await this.fetchAndUpdateStopAndPolylineDataForRoutesInExistingSystemsInRepository();
|
|
await this.repository.clearShuttleData();
|
|
await this.fetchAndUpdateShuttleDataForExistingSystemsInRepository();
|
|
await this.repository.clearEtaData();
|
|
await this.fetchAndUpdateEtaDataForExistingStopsForSystemsInRepository();
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
|
|
this.timer = setTimeout(this.startFetchDataAndUpdate, this.timeout);
|
|
}
|
|
} |