rename existing repository to shuttle repository

This commit is contained in:
2025-03-27 09:32:29 -07:00
parent 3a85f3da8b
commit fab99db755
15 changed files with 46 additions and 47 deletions

View File

@@ -1,7 +1,7 @@
import { ETANotificationScheduler } from "./notifications/schedulers/ETANotificationScheduler";
import { GetterSetterRepository } from "./repositories/GetterSetterRepository";
import { ShuttleGetterSetterRepository } from "./repositories/ShuttleGetterSetterRepository";
export interface ServerContext {
repository: GetterSetterRepository;
repository: ShuttleGetterSetterRepository;
notificationService: ETANotificationScheduler;
}

View File

@@ -3,7 +3,7 @@ import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
import { MergedResolvers } from "./MergedResolvers";
import { ServerContext } from "./ServerContext";
import { UnoptimizedInMemoryRepository } from "./repositories/UnoptimizedInMemoryRepository";
import { UnoptimizedInMemoryShuttleRepository } from "./repositories/UnoptimizedInMemoryShuttleRepository";
import { TimedApiBasedRepositoryLoader } from "./loaders/TimedApiBasedRepositoryLoader";
import { ETANotificationScheduler } from "./notifications/schedulers/ETANotificationScheduler";
import { loadTestData } from "./loaders/loadTestData";
@@ -18,7 +18,7 @@ async function main() {
introspection: process.env.NODE_ENV !== "production",
});
const repository = new UnoptimizedInMemoryRepository();
const repository = new UnoptimizedInMemoryShuttleRepository();
let notificationService: ETANotificationScheduler;
if (process.argv.length > 2 && process.argv[2] == "integration-testing") {
console.log("Using integration testing setup")
@@ -37,7 +37,7 @@ async function main() {
listen: {
port: process.env.PORT ? parseInt(process.env.PORT) : 4000,
},
context: async ({ req, res }) => {
context: async () => {
return {
repository,
notificationService,

View File

@@ -1,4 +1,4 @@
import { GetterSetterRepository } from "../repositories/GetterSetterRepository";
import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository";
import { IEntityWithId, IEta, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
import { RepositoryLoader } from "./RepositoryLoader";
@@ -19,7 +19,7 @@ export class ApiBasedRepositoryLoader implements RepositoryLoader {
baseUrl = "https://passiogo.com/mapGetData.php";
constructor(
public repository: GetterSetterRepository,
public repository: ShuttleGetterSetterRepository,
) {
}

View File

@@ -1,5 +1,4 @@
import { GetterSetterRepository } from "../repositories/GetterSetterRepository";
import { IEta, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository";
import { ApiBasedRepositoryLoader } from "./ApiBasedRepositoryLoader";
// Ideas to break this into smaller pieces in the future:
@@ -23,7 +22,7 @@ export class TimedApiBasedRepositoryLoader extends ApiBasedRepositoryLoader {
readonly timeout = 10000;
constructor(
repository: GetterSetterRepository,
repository: ShuttleGetterSetterRepository,
) {
super(repository);
this.startFetchDataAndUpdate = this.startFetchDataAndUpdate.bind(this);
@@ -62,4 +61,4 @@ export class TimedApiBasedRepositoryLoader extends ApiBasedRepositoryLoader {
this.timer = setTimeout(this.startFetchDataAndUpdate, this.timeout);
}
}
}

View File

@@ -1,6 +1,6 @@
// Mock data
import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
import { GetterSetterRepository } from "../repositories/GetterSetterRepository";
import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository";
const systems: ISystem[] = [
{
@@ -4454,7 +4454,7 @@ const etas: IEta[] = [
}
];
export async function loadTestData(repository: GetterSetterRepository) {
export async function loadTestData(repository: ShuttleGetterSetterRepository) {
await Promise.all(systems.map(async (system) => {
await repository.addOrUpdateSystem(system);
}));

View File

@@ -1,4 +1,4 @@
import { GetterRepository } from "../../repositories/GetterRepository";
import { ShuttleGetterRepository } from "../../repositories/ShuttleGetterRepository";
import { TupleKey } from "../../types/TupleKey";
import { IEta } from "../../entities/entities";
import { AppleNotificationSender, NotificationAlertArguments } from "../senders/AppleNotificationSender";
@@ -24,7 +24,7 @@ type DeviceIdSecondsThresholdAssociation = { [key: string]: number };
export class ETANotificationScheduler {
public static readonly defaultSecondsThresholdForNotificationToFire = 180;
constructor(private repository: GetterRepository,
constructor(private shuttleRepository: ShuttleGetterRepository,
private appleNotificationSender = new AppleNotificationSender()
) {
this.etaSubscriberCallback = this.etaSubscriberCallback.bind(this);
@@ -50,9 +50,9 @@ export class ETANotificationScheduler {
private async sendEtaNotificationImmediately(notificationData: NotificationSchedulingArguments): Promise<boolean> {
const { deviceId, shuttleId, stopId } = notificationData;
const shuttle = await this.repository.getShuttleById(shuttleId);
const stop = await this.repository.getStopById(stopId);
const eta = await this.repository.getEtaForShuttleAndStopId(shuttleId, stopId);
const shuttle = await this.shuttleRepository.getShuttleById(shuttleId);
const stop = await this.shuttleRepository.getStopById(stopId);
const eta = await this.shuttleRepository.getEtaForShuttleAndStopId(shuttleId, stopId);
if (!shuttle) {
console.warn(`Notification ${notificationData} fell through; no associated shuttle`);
return false;
@@ -127,8 +127,8 @@ export class ETANotificationScheduler {
this.deviceIdsToDeliverTo[tuple.toString()][deviceId] = secondsThreshold;
this.repository.unsubscribeFromEtaUpdates(this.etaSubscriberCallback);
this.repository.subscribeToEtaUpdates(this.etaSubscriberCallback);
this.shuttleRepository.unsubscribeFromEtaUpdates(this.etaSubscriberCallback);
this.shuttleRepository.subscribeToEtaUpdates(this.etaSubscriberCallback);
}
/**

View File

@@ -1,6 +1,6 @@
import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
export interface GetterRepository {
export interface ShuttleGetterRepository {
getSystems(): Promise<ISystem[]>;
getSystemById(systemId: string): Promise<ISystem | null>;

View File

@@ -1,16 +1,16 @@
// If types match closely, we can use TypeScript "casting"
// to convert from data repo to GraphQL schema
import { GetterRepository } from "./GetterRepository";
import { ShuttleGetterRepository } from "./ShuttleGetterRepository";
import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
/**
* GetterRepository interface for data derived from Passio API.
* ShuttleGetterRepository interface for data derived from Passio API.
* The repository is not designed to have write locks in place.
* Objects passed from/to the repository should be treated
* as disposable.
*/
export interface GetterSetterRepository extends GetterRepository {
export interface ShuttleGetterSetterRepository extends ShuttleGetterRepository {
// Setter methods
addOrUpdateSystem(system: ISystem): Promise<void>;
addOrUpdateRoute(route: IRoute): Promise<void>;

View File

@@ -1,4 +1,4 @@
import { GetterSetterRepository } from "./GetterSetterRepository";
import { ShuttleGetterSetterRepository } from "./ShuttleGetterSetterRepository";
import { IEntityWithId, IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../entities/entities";
/**
@@ -6,7 +6,7 @@ import { IEntityWithId, IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } f
* (I would optimize it with actual data structures, but I'm
* switching to another data store later anyways)
*/
export class UnoptimizedInMemoryRepository implements GetterSetterRepository {
export class UnoptimizedInMemoryShuttleRepository implements ShuttleGetterSetterRepository {
private systems: ISystem[] = [];
private stops: IStop[] = [];
private routes: IRoute[] = [];