diff --git a/schema.graphqls b/schema.graphqls index 8449ef8..4e3c22d 100644 --- a/schema.graphqls +++ b/schema.graphqls @@ -1,4 +1,3 @@ -# Base types type System { id: ID! name: String! @@ -8,6 +7,19 @@ type System { stop(id: ID): Stop shuttles: [Shuttle!] shuttle(id: ID): Shuttle + + # TODO: Implement these in system resolvers + parkingStructures: [ParkingStructure!] + parkingStructure(id: ID): ParkingStructure +} + +type ParkingStructure { + id: ID! + name: String! + capacity: Int! + spotsAvailable: Int! + coordinates: Coordinates! + address: String! } type Route { diff --git a/src/entities/ParkingRepositoryEntities.ts b/src/entities/ParkingRepositoryEntities.ts new file mode 100644 index 0000000..f0dadea --- /dev/null +++ b/src/entities/ParkingRepositoryEntities.ts @@ -0,0 +1,11 @@ +import { ICoordinates, IEntityWithId, IEntityWithOptionalTimestamp } from "./SharedEntities"; + +export interface IParkingStructure extends IEntityWithOptionalTimestamp, IEntityWithId { + address: string; + capacity: number; + spotsAvailable: number; + coordinates: ICoordinates; + name: string; +} + +// In the future, add support for viewing different levels of the structure diff --git a/src/entities/SharedEntities.ts b/src/entities/SharedEntities.ts new file mode 100644 index 0000000..ad723c5 --- /dev/null +++ b/src/entities/SharedEntities.ts @@ -0,0 +1,13 @@ +export interface IEntityWithOptionalTimestamp { + millisecondsSinceEpoch?: number; +} + +export interface IEntityWithId { + id: string; +} + +export interface ICoordinates { + latitude: number; + longitude: number; +} + diff --git a/src/entities/entities.ts b/src/entities/ShuttleRepositoryEntities.ts similarity index 73% rename from src/entities/entities.ts rename to src/entities/ShuttleRepositoryEntities.ts index f98faa5..3ab9a29 100644 --- a/src/entities/entities.ts +++ b/src/entities/ShuttleRepositoryEntities.ts @@ -1,19 +1,4 @@ -export interface IEntityWithOptionalTimestamp { - millisecondsSinceEpoch?: number; -} - -export interface IEntityWithId { - id: string; -} - -export interface IPassioSystem extends IEntityWithId, IEntityWithOptionalTimestamp { - name: string; -} - -export interface ICoordinates { - latitude: number; - longitude: number; -} +import { ICoordinates, IEntityWithId, IEntityWithOptionalTimestamp } from "./SharedEntities"; export interface IRoute extends IEntityWithId, IEntityWithOptionalTimestamp { name: string; diff --git a/src/loaders/ApiBasedShuttleRepositoryLoader.ts b/src/loaders/ApiBasedShuttleRepositoryLoader.ts index 49031ef..ff145cf 100644 --- a/src/loaders/ApiBasedShuttleRepositoryLoader.ts +++ b/src/loaders/ApiBasedShuttleRepositoryLoader.ts @@ -1,6 +1,7 @@ import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository"; -import { IEntityWithId, IEta, IRoute, IShuttle, IStop } from "../entities/entities"; +import { IEta, IRoute, IShuttle, IStop } from "../entities/ShuttleRepositoryEntities"; import { ShuttleRepositoryLoader } from "./ShuttleRepositoryLoader"; +import { IEntityWithId } from "../entities/SharedEntities"; export class ApiResponseError extends Error { constructor(message: string) { diff --git a/src/loaders/loadShuttleTestData.ts b/src/loaders/loadShuttleTestData.ts index c59b4bf..b97c99d 100644 --- a/src/loaders/loadShuttleTestData.ts +++ b/src/loaders/loadShuttleTestData.ts @@ -1,5 +1,5 @@ // Mock data -import { IEta, IOrderedStop, IRoute, IShuttle, IStop, IPassioSystem } from "../entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/ShuttleRepositoryEntities"; import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository"; import { InterchangeSystemBuilderArguments } from "../entities/InterchangeSystem"; diff --git a/src/notifications/schedulers/ETANotificationScheduler.ts b/src/notifications/schedulers/ETANotificationScheduler.ts index 98a16a2..97a2d4d 100644 --- a/src/notifications/schedulers/ETANotificationScheduler.ts +++ b/src/notifications/schedulers/ETANotificationScheduler.ts @@ -1,5 +1,5 @@ import { ShuttleGetterRepository } from "../../repositories/ShuttleGetterRepository"; -import { IEta } from "../../entities/entities"; +import { IEta } from "../../entities/ShuttleRepositoryEntities"; import { AppleNotificationSender, NotificationAlertArguments } from "../senders/AppleNotificationSender"; import { NotificationRepository, diff --git a/src/repositories/ShuttleGetterRepository.ts b/src/repositories/ShuttleGetterRepository.ts index 8f59578..f705e15 100644 --- a/src/repositories/ShuttleGetterRepository.ts +++ b/src/repositories/ShuttleGetterRepository.ts @@ -1,4 +1,4 @@ -import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/ShuttleRepositoryEntities"; /** * Shuttle getter repository to be linked to a system. diff --git a/src/repositories/ShuttleGetterSetterRepository.ts b/src/repositories/ShuttleGetterSetterRepository.ts index 5e5a925..6f23bc1 100644 --- a/src/repositories/ShuttleGetterSetterRepository.ts +++ b/src/repositories/ShuttleGetterSetterRepository.ts @@ -2,7 +2,7 @@ // to convert from data repo to GraphQL schema import { ShuttleGetterRepository } from "./ShuttleGetterRepository"; -import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/ShuttleRepositoryEntities"; /** * ShuttleGetterRepository interface for data derived from Passio API. diff --git a/src/repositories/UnoptimizedInMemoryShuttleRepository.ts b/src/repositories/UnoptimizedInMemoryShuttleRepository.ts index b8dda6f..fd6c36f 100644 --- a/src/repositories/UnoptimizedInMemoryShuttleRepository.ts +++ b/src/repositories/UnoptimizedInMemoryShuttleRepository.ts @@ -1,5 +1,6 @@ import { ShuttleGetterSetterRepository } from "./ShuttleGetterSetterRepository"; -import { IEntityWithId, IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../entities/ShuttleRepositoryEntities"; +import { IEntityWithId } from "../entities/SharedEntities"; /** * An unoptimized in memory repository. diff --git a/src/resolvers/SystemResolvers.ts b/src/resolvers/SystemResolvers.ts index de8e3b0..4f5205f 100644 --- a/src/resolvers/SystemResolvers.ts +++ b/src/resolvers/SystemResolvers.ts @@ -70,13 +70,19 @@ export const SystemResolvers: Resolvers = { return shuttle; }, - shuttles: async (parent, args, contextValue, _info) => { + shuttles: async (parent, _args, contextValue, _info) => { const system = contextValue.findSystemById(parent.id); if (!system) { return []; } return await system.shuttleRepository.getShuttles(); - } + }, + parkingStructures: async (_parent, _args, _contextValue, _info) => { + return []; + }, + parkingStructure: async (_parent, _args, _contextValue, _info) => { + return null; + }, }, } diff --git a/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts b/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts index 58ee0b3..b9f1790 100644 --- a/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts +++ b/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, jest } from "@jest/globals"; import { ETANotificationScheduler } from "../../../src/notifications/schedulers/ETANotificationScheduler"; import { UnoptimizedInMemoryShuttleRepository } from "../../../src/repositories/UnoptimizedInMemoryShuttleRepository"; -import { IEta, IShuttle, IStop } from "../../../src/entities/entities"; +import { IEta, IShuttle, IStop } from "../../../src/entities/ShuttleRepositoryEntities"; import { addMockShuttleToRepository, addMockStopToRepository } from "../../testHelpers/repositorySetupHelpers"; import { AppleNotificationSender } from "../../../src/notifications/senders/AppleNotificationSender"; import { InMemoryNotificationRepository } from "../../../src/repositories/InMemoryNotificationRepository"; diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 1238f22..5611f9a 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -1,8 +1,9 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers"; -import { IEta, IShuttle, IStop, IPassioSystem } from "../../src/entities/entities"; +import { IEta, IShuttle, IStop } from "../../src/entities/ShuttleRepositoryEntities"; import { - addMockEtaToRepository, addMockShuttleToRepository, + addMockEtaToRepository, + addMockShuttleToRepository, addMockStopToRepository, } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); @@ -22,7 +23,7 @@ describe("EtaResolvers", () => { }); async function getResponseForEtaQuery(query: string) { - const response = await holder.testServer.executeOperation({ + return await holder.testServer.executeOperation({ query, variables: { systemId: context.systems[0].id, @@ -32,7 +33,6 @@ describe("EtaResolvers", () => { contextValue: context }); - return response; } describe("stop", () => { diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 855fbd4..5484b3a 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers"; -import { IRoute, IStop, IPassioSystem } from "../../src/entities/entities"; +import { IRoute, IStop } from "../../src/entities/ShuttleRepositoryEntities"; import { generateMockOrderedStops, generateMockStops } from "../testHelpers/mockDataGenerators"; import { addMockRouteToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index c471549..3bc3dae 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "@jest/globals"; -import { generateMockPassioSystems } from "../testHelpers/mockDataGenerators"; import { buildSystemForTesting, setupTestServerContext, diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 71c7815..2b13583 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -5,14 +5,15 @@ import { addMockStopToRepository } from "../testHelpers/repositorySetupHelpers"; import { generateMockOrderedStops, generateMockShuttles } from "../testHelpers/mockDataGenerators"; -import { IRoute, IStop, IPassioSystem } from "../../src/entities/entities"; +import { IRoute, IStop } from "../../src/entities/ShuttleRepositoryEntities"; import assert = require("node:assert"); +import { InterchangeSystem } from "../../src/entities/InterchangeSystem"; describe("RouteResolvers", () => { const holder = setupTestServerHolder(); const context = setupTestServerContext(); - let mockSystem: IPassioSystem; + let mockSystem: InterchangeSystem; let mockRoute: IRoute; let mockStop: IStop; diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 31ba7a5..bf8cc5d 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -1,16 +1,17 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { generateMockEtas, generateMockRoutes } from "../testHelpers/mockDataGenerators"; -import { IShuttle, IPassioSystem } from "../../src/entities/entities"; +import { IShuttle } from "../../src/entities/ShuttleRepositoryEntities"; import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers"; import { addMockShuttleToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); +import { InterchangeSystem } from "../../src/entities/InterchangeSystem"; describe("ShuttleResolvers", () => { const holder = setupTestServerHolder(); const context = setupTestServerContext(); - let mockSystem: IPassioSystem; + let mockSystem: InterchangeSystem; let mockShuttle: IShuttle; beforeEach(async () => { diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index ac732e8..6bf31cd 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -4,7 +4,7 @@ import { setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers"; import { generateMockEtas, generateMockOrderedStops } from "../testHelpers/mockDataGenerators"; -import { IStop } from "../../src/entities/entities"; +import { IStop } from "../../src/entities/ShuttleRepositoryEntities"; import { addMockStopToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index bf86d8e..4333fef 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -6,14 +6,14 @@ import { addMockShuttleToRepository, addMockStopToRepository, } from "../testHelpers/repositorySetupHelpers"; -import { IPassioSystem } from "../../src/entities/entities"; import assert = require("node:assert"); +import { InterchangeSystem } from "../../src/entities/InterchangeSystem"; describe("SystemResolvers", () => { const holder = setupTestServerHolder(); const context = setupTestServerContext(); - let mockSystem: IPassioSystem; + let mockSystem: InterchangeSystem; beforeEach(async () => { mockSystem = context.systems[0]; diff --git a/test/testHelpers/mockDataGenerators.ts b/test/testHelpers/mockDataGenerators.ts index 8f2afa4..36d422f 100644 --- a/test/testHelpers/mockDataGenerators.ts +++ b/test/testHelpers/mockDataGenerators.ts @@ -1,16 +1,8 @@ -import { IEta, IOrderedStop, IRoute, IShuttle, IStop, IPassioSystem } from "../../src/entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop } from "../../src/entities/ShuttleRepositoryEntities"; // Use a single set of generators in case any of the // interfaces change in the future -export function generateMockPassioSystems(): IPassioSystem[] { - return [ - { id: "1", name: "System A" }, - { id: "2", name: "System B" }, - { id: "3", name: "System C" }, - ]; -} - export function generateMockShuttles(): IShuttle[] { return [ {