import { ShuttleRepositoryLoader } from "../loaders/ShuttleRepositoryLoader"; import { ETANotificationScheduler } from "../notifications/schedulers/ETANotificationScheduler"; import { TimedApiBasedShuttleRepositoryLoader } from "../loaders/TimedApiBasedShuttleRepositoryLoader"; import { UnoptimizedInMemoryShuttleRepository } from "../repositories/UnoptimizedInMemoryShuttleRepository"; import { RedisNotificationRepository } from "../repositories/RedisNotificationRepository"; import { NotificationRepository } from "../repositories/NotificationRepository"; import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository"; export class System { constructor( public systemId: string, public shuttleDataLoader: ShuttleRepositoryLoader, public shuttleRepository: ShuttleGetterSetterRepository, public notificationScheduler: ETANotificationScheduler, public notificationRepository: NotificationRepository, ) { } /** * Construct an instance of the class where all composited * classes are correctly linked. * @param systemId * @param notificationRepository */ static build( systemId: string, notificationRepository: NotificationRepository = new RedisNotificationRepository() ) { const shuttleRepository = new UnoptimizedInMemoryShuttleRepository(); const shuttleDataLoader = new TimedApiBasedShuttleRepositoryLoader(systemId, shuttleRepository); const notificationScheduler = new ETANotificationScheduler(shuttleRepository, notificationRepository); const system = new System( systemId, shuttleDataLoader, shuttleRepository, notificationScheduler, notificationRepository, ); return system; } }