From 267da3ff362f3581b4c42390df4f6cbb278198f4 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 16 Apr 2025 16:22:01 -0700 Subject: [PATCH] update InterchangeSystem build methods to attach parking system --- src/entities/InterchangeSystem.ts | 49 ++++++++++++++++++- .../buildParkingRepositoryLoaderIfExists.ts | 4 +- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/entities/InterchangeSystem.ts b/src/entities/InterchangeSystem.ts index d1a33c4..2cb9072 100644 --- a/src/entities/InterchangeSystem.ts +++ b/src/entities/InterchangeSystem.ts @@ -7,6 +7,12 @@ import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSett import { InMemoryNotificationRepository } from "../repositories/InMemoryNotificationRepository"; import { AppleNotificationSender } from "../notifications/senders/AppleNotificationSender"; import { ApiBasedShuttleRepositoryLoader } from "../loaders/shuttle/ApiBasedShuttleRepositoryLoader"; +import { ParkingGetterSetterRepository } from "../repositories/ParkingGetterSetterRepository"; +import { InMemoryParkingRepository } from "../repositories/InMemoryParkingRepository"; +import { + buildParkingRepositoryLoaderIfExists, + ParkingRepositoryLoaderBuilderArguments +} from "../loaders/parking/buildParkingRepositoryLoaderIfExists"; export interface InterchangeSystemBuilderArguments { name: string; @@ -20,16 +26,23 @@ export interface InterchangeSystemBuilderArguments { * ID for fetching shuttle data from the Passio GO! system. */ passioSystemId: string; + + /** + * ID for the parking repository ID in the codebase. + */ + parkingSystemId?: string; } export class InterchangeSystem { - constructor( + private constructor( public name: string, public id: string, public shuttleTimedDataLoader: TimedApiBasedRepositoryLoader, public shuttleRepository: ShuttleGetterSetterRepository, public notificationScheduler: ETANotificationScheduler, public notificationRepository: NotificationRepository, + public parkingTimedDataLoader: TimedApiBasedRepositoryLoader | null, + public parkingRepository: ParkingGetterSetterRepository | null, ) { } @@ -61,6 +74,9 @@ export class InterchangeSystem { ); notificationScheduler.startListeningForUpdates(); + let { parkingRepository, timedParkingLoader } = this.buildParkingLoaderAndRepository(args.parkingSystemId); + timedParkingLoader?.start(); + return new InterchangeSystem( args.name, args.id, @@ -68,6 +84,8 @@ export class InterchangeSystem { shuttleRepository, notificationScheduler, notificationRepository, + timedParkingLoader, + parkingRepository, ); } @@ -100,6 +118,9 @@ export class InterchangeSystem { ); notificationScheduler.startListeningForUpdates(); + let { parkingRepository, timedParkingLoader } = this.buildParkingLoaderAndRepository(args.parkingSystemId); + // Timed parking loader is not started + return new InterchangeSystem( args.name, args.id, @@ -107,6 +128,32 @@ export class InterchangeSystem { shuttleRepository, notificationScheduler, notificationRepository, + timedParkingLoader, + parkingRepository, ); } + + private static buildParkingLoaderAndRepository(id?: string) { + if (id === undefined) { + return { parkingRepository: null, timedParkingLoader: null }; + } + + let parkingRepository: ParkingGetterSetterRepository | null = new InMemoryParkingRepository(); + const loaderBuilderArguments: ParkingRepositoryLoaderBuilderArguments = { + id, + repository: parkingRepository, + }; + let parkingLoader = buildParkingRepositoryLoaderIfExists( + loaderBuilderArguments, + ); + + let timedParkingLoader = null; + if (parkingLoader == null) { + parkingRepository = null; + } else { + timedParkingLoader = new TimedApiBasedRepositoryLoader(parkingLoader); + } + return { parkingRepository, timedParkingLoader }; + } + } diff --git a/src/loaders/parking/buildParkingRepositoryLoaderIfExists.ts b/src/loaders/parking/buildParkingRepositoryLoaderIfExists.ts index cea713b..ae0383e 100644 --- a/src/loaders/parking/buildParkingRepositoryLoaderIfExists.ts +++ b/src/loaders/parking/buildParkingRepositoryLoaderIfExists.ts @@ -1,12 +1,12 @@ import { ParkingGetterSetterRepository } from "../../repositories/ParkingGetterSetterRepository"; import { ChapmanApiBasedParkingRepositoryLoader } from "./ChapmanApiBasedParkingRepositoryLoader"; -interface ParkingRepositoryBuilderArguments { +export interface ParkingRepositoryLoaderBuilderArguments { id: string; repository: ParkingGetterSetterRepository; } -export function buildParkingRepositoryLoaderIfExists(args: ParkingRepositoryBuilderArguments) { +export function buildParkingRepositoryLoaderIfExists(args: ParkingRepositoryLoaderBuilderArguments) { if (args.id === ChapmanApiBasedParkingRepositoryLoader.id) { return new ChapmanApiBasedParkingRepositoryLoader(args.repository); }