add implementation for updateShuttlesForSystemIfTTL

This commit is contained in:
2025-01-08 15:55:39 -08:00
parent 65211df3b7
commit 0996be0ce3

View File

@@ -1,6 +1,8 @@
import { GetterRepository } from "./GetterRepository"; import { GetterRepository } from "./GetterRepository";
import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities"; import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
const baseUrl = "https://passiogo.com/mapGetData.php"
export interface ApiBasedRepositoryCache { export interface ApiBasedRepositoryCache {
etasForShuttleId?: { etasForShuttleId?: {
[shuttleId: string]: IEta[], [shuttleId: string]: IEta[],
@@ -30,6 +32,8 @@ export interface ApiBasedRepositoryMillisecondTTLs {
const emptyCache: ApiBasedRepositoryCache = { const emptyCache: ApiBasedRepositoryCache = {
etasForShuttleId: {}, etasForShuttleId: {},
etasForStopId: {}, etasForStopId: {},
shuttleByShuttleId: {},
shuttlesBySystemId: {},
} }
const defaultTtls: ApiBasedRepositoryMillisecondTTLs = { const defaultTtls: ApiBasedRepositoryMillisecondTTLs = {
@@ -67,6 +71,7 @@ export class ApiBasedRepository implements GetterRepository {
if (!systemId) { if (!systemId) {
return null; return null;
} }
await this.updateEtasForSystemIfTTL(systemId);
if (this.cache?.etasForStopId !== undefined) { if (this.cache?.etasForStopId !== undefined) {
const etas = this.cache.etasForStopId[systemId]; const etas = this.cache.etasForStopId[systemId];
@@ -88,7 +93,24 @@ export class ApiBasedRepository implements GetterRepository {
} }
public async updateEtasForSystemIfTTL(systemId: string) { public async updateEtasForSystemIfTTL(systemId: string) {
try {
const params = {
eta: "3",
stopIds: "177666",
};
const query = new URLSearchParams(params).toString();
const response = await fetch(`${baseUrl}?${query}`, {
method: "GET",
});
const json = await response.json();
if (json.ETAs && !json.ETAs["0000"]) {
}
} catch (e) {
console.error(e);
}
} }
// TODO: migrate rest of logic over to this class // TODO: migrate rest of logic over to this class
@@ -145,8 +167,63 @@ export class ApiBasedRepository implements GetterRepository {
} }
public async updateShuttlesForSystemIfTTL(systemId: string) { public async updateShuttlesForSystemIfTTL(systemId: string) {
// Update shuttleByShuttleId, shuttlesBySystemId, shuttlesByRouteId (future) try {
// Update shuttleByShuttleId, shuttlesBySystemId, shuttlesByRouteId (future)
const params = {
getBuses: "2"
};
const formDataJsonObject = {
"s0": systemId,
"sA": "1"
};
const formData = new FormData();
formData.set("json", JSON.stringify(formDataJsonObject));
const query = new URLSearchParams(params).toString();
const response = await fetch(`${baseUrl}?${query}`, {
method: "POST",
body: formData,
});
const json = await response.json();
if (json.buses && json.buses["-1"] === undefined) {
const jsonBuses = Object.values(json.buses).map((busesArr: any) => {
return busesArr[0];
});
// Store shuttles by system, with the additional side effect that
// shuttleByShuttleId is updated
const shuttles = await Promise.all(jsonBuses.map(async (jsonBus: any) => {
const constructedShuttle: IShuttle = {
name: jsonBus.bus,
coordinates: {
latitude: parseFloat(jsonBus.latitude),
longitude: parseFloat(jsonBus.longitude),
},
routeId: jsonBus.routeId,
systemId: systemId,
id: `${jsonBus.busId}`
}
if (this.cache.shuttleByShuttleId) {
this.cache.shuttleByShuttleId[jsonBus.busId] = constructedShuttle;
}
return constructedShuttle;
}));
if (this.cache.shuttlesBySystemId) {
this.cache.shuttlesBySystemId[systemId] = shuttles;
}
} else {
console.warn(`No shuttle data available for system ID ${systemId} and JSON output
${json}`);
}
} catch (e) {
console.error(e);
}
} }
public async getStopById(stopId: string): Promise<| null> { public async getStopById(stopId: string): Promise<| null> {