From 0cf2a4d2e7324d58b9e07be45bb35e7f677e470f Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 13 Nov 2025 18:35:20 -0800 Subject: [PATCH] Add logic to clear out previous ETAs --- .../eta/InMemorySelfUpdatingETARepository.ts | 18 ++++++++++++++++++ .../eta/RedisSelfUpdatingETARepository.ts | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/repositories/shuttle/eta/InMemorySelfUpdatingETARepository.ts b/src/repositories/shuttle/eta/InMemorySelfUpdatingETARepository.ts index 5503939..bc56789 100644 --- a/src/repositories/shuttle/eta/InMemorySelfUpdatingETARepository.ts +++ b/src/repositories/shuttle/eta/InMemorySelfUpdatingETARepository.ts @@ -2,6 +2,7 @@ import { SelfUpdatingETARepository } from "./SelfUpdatingETARepository"; import { ShuttleGetterRepository, ShuttleRepositoryEvent, ShuttleStopArrival, ShuttleTravelTimeDataIdentifier, ShuttleTravelTimeDateFilterArguments } from "../ShuttleGetterRepository"; import { BaseInMemoryETARepository } from "./BaseInMemoryETARepository"; import { IOrderedStop, IShuttle } from "../../../entities/ShuttleRepositoryEntities"; +import { ETARepositoryEvent } from "./ETAGetterRepository"; export class InMemorySelfUpdatingETARepository extends BaseInMemoryETARepository implements SelfUpdatingETARepository { private referenceTime: Date | null = null; @@ -155,6 +156,11 @@ export class InMemorySelfUpdatingETARepository extends BaseInMemoryETARepository } private async handleShuttleWillArriveAtStop(shuttleArrival: ShuttleStopArrival): Promise { + const etas = await this.getEtasForShuttleId(shuttleArrival.shuttleId); + for (const eta of etas) { + await this.removeEtaIfExists(eta.shuttleId, eta.stopId); + } + const lastStopTimestamp = await this.shuttleRepository.getShuttleLastStopArrival(shuttleArrival.shuttleId); if (lastStopTimestamp) { // disallow cases where this gets triggered multiple times @@ -182,4 +188,16 @@ export class InMemorySelfUpdatingETARepository extends BaseInMemoryETARepository dataPoints.push({ timestamp, seconds: travelTimeSeconds }); this.travelTimeData.set(key, dataPoints); } + + private async removeEtaIfExists(shuttleId: string, stopId: string) { + const index = this.etas.findIndex((e) => e.stopId === stopId && e.shuttleId === shuttleId); + if (index === -1) { + return null; + } + + const removedEta = this.etas[index]; + this.etas.splice(index, 1); + this.emit(ETARepositoryEvent.ETA_REMOVED, removedEta); + return removedEta; + } } diff --git a/src/repositories/shuttle/eta/RedisSelfUpdatingETARepository.ts b/src/repositories/shuttle/eta/RedisSelfUpdatingETARepository.ts index 9b87919..6ce6e24 100644 --- a/src/repositories/shuttle/eta/RedisSelfUpdatingETARepository.ts +++ b/src/repositories/shuttle/eta/RedisSelfUpdatingETARepository.ts @@ -3,7 +3,8 @@ import { BaseRedisETARepository } from "./BaseRedisETARepository"; import { createClient, RedisClientType } from "redis"; import { ShuttleGetterRepository, ShuttleRepositoryEvent, ShuttleStopArrival, ShuttleTravelTimeDataIdentifier, ShuttleTravelTimeDateFilterArguments } from "../ShuttleGetterRepository"; import { REDIS_RECONNECT_INTERVAL } from "../../../environment"; -import { IOrderedStop, IShuttle } from "../../../entities/ShuttleRepositoryEntities"; +import { IEta, IOrderedStop, IShuttle } from "../../../entities/ShuttleRepositoryEntities"; +import { ETARepositoryEvent } from "./ETAGetterRepository"; export class RedisSelfUpdatingETARepository extends BaseRedisETARepository implements SelfUpdatingETARepository { constructor( @@ -176,6 +177,11 @@ export class RedisSelfUpdatingETARepository extends BaseRedisETARepository imple private async handleShuttleWillArriveAtStop( shuttleArrival: ShuttleStopArrival, ) { + const etas = await this.getEtasForShuttleId(shuttleArrival.shuttleId); + for (const eta of etas) { + await this.removeEtaIfExists(eta.shuttleId, eta.stopId); + } + const lastStopTimestamp = await this.shuttleRepository.getShuttleLastStopArrival(shuttleArrival.shuttleId); if (lastStopTimestamp) { // disallow cases where this gets triggered multiple times @@ -265,4 +271,15 @@ export class RedisSelfUpdatingETARepository extends BaseRedisETARepository imple } } + private async removeEtaIfExists(shuttleId: string, stopId: string): Promise { + const existingEta = await this.getEtaForShuttleAndStopId(shuttleId, stopId); + if (existingEta === null) { + return null; + } + + const key = this.createEtaKey(shuttleId, stopId); + await this.redisClient.del(key); + this.emit(ETARepositoryEvent.ETA_REMOVED, existingEta); + return existingEta; + } }