mirror of
https://github.com/brendan-ch/project-inter-server.git
synced 2026-04-17 07:50:31 +00:00
Merge pull request #39 from brendan-ch/feat/parking-data-models
[INT-60] feat/parking-data-models
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
# Base types
|
|
||||||
type System {
|
type System {
|
||||||
id: ID!
|
id: ID!
|
||||||
name: String!
|
name: String!
|
||||||
@@ -8,6 +7,19 @@ type System {
|
|||||||
stop(id: ID): Stop
|
stop(id: ID): Stop
|
||||||
shuttles: [Shuttle!]
|
shuttles: [Shuttle!]
|
||||||
shuttle(id: ID): 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 {
|
type Route {
|
||||||
|
|||||||
11
src/entities/ParkingRepositoryEntities.ts
Normal file
11
src/entities/ParkingRepositoryEntities.ts
Normal file
@@ -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
|
||||||
13
src/entities/SharedEntities.ts
Normal file
13
src/entities/SharedEntities.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export interface IEntityWithOptionalTimestamp {
|
||||||
|
millisecondsSinceEpoch?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IEntityWithId {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICoordinates {
|
||||||
|
latitude: number;
|
||||||
|
longitude: number;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,19 +1,4 @@
|
|||||||
export interface IEntityWithOptionalTimestamp {
|
import { ICoordinates, IEntityWithId, IEntityWithOptionalTimestamp } from "./SharedEntities";
|
||||||
millisecondsSinceEpoch?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IEntityWithId {
|
|
||||||
id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPassioSystem extends IEntityWithId, IEntityWithOptionalTimestamp {
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ICoordinates {
|
|
||||||
latitude: number;
|
|
||||||
longitude: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IRoute extends IEntityWithId, IEntityWithOptionalTimestamp {
|
export interface IRoute extends IEntityWithId, IEntityWithOptionalTimestamp {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository";
|
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 { ShuttleRepositoryLoader } from "./ShuttleRepositoryLoader";
|
||||||
|
import { IEntityWithId } from "../entities/SharedEntities";
|
||||||
|
|
||||||
export class ApiResponseError extends Error {
|
export class ApiResponseError extends Error {
|
||||||
constructor(message: string) {
|
constructor(message: string) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// Mock data
|
// 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 { ShuttleGetterSetterRepository } from "../repositories/ShuttleGetterSetterRepository";
|
||||||
import { InterchangeSystemBuilderArguments } from "../entities/InterchangeSystem";
|
import { InterchangeSystemBuilderArguments } from "../entities/InterchangeSystem";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ShuttleGetterRepository } from "../../repositories/ShuttleGetterRepository";
|
import { ShuttleGetterRepository } from "../../repositories/ShuttleGetterRepository";
|
||||||
import { IEta } from "../../entities/entities";
|
import { IEta } from "../../entities/ShuttleRepositoryEntities";
|
||||||
import { AppleNotificationSender, NotificationAlertArguments } from "../senders/AppleNotificationSender";
|
import { AppleNotificationSender, NotificationAlertArguments } from "../senders/AppleNotificationSender";
|
||||||
import {
|
import {
|
||||||
NotificationRepository,
|
NotificationRepository,
|
||||||
|
|||||||
@@ -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.
|
* Shuttle getter repository to be linked to a system.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// to convert from data repo to GraphQL schema
|
// to convert from data repo to GraphQL schema
|
||||||
|
|
||||||
import { ShuttleGetterRepository } from "./ShuttleGetterRepository";
|
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.
|
* ShuttleGetterRepository interface for data derived from Passio API.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ShuttleGetterSetterRepository } from "./ShuttleGetterSetterRepository";
|
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.
|
* An unoptimized in memory repository.
|
||||||
|
|||||||
@@ -70,13 +70,19 @@ export const SystemResolvers: Resolvers<ServerContext> = {
|
|||||||
|
|
||||||
return shuttle;
|
return shuttle;
|
||||||
},
|
},
|
||||||
shuttles: async (parent, args, contextValue, _info) => {
|
shuttles: async (parent, _args, contextValue, _info) => {
|
||||||
const system = contextValue.findSystemById(parent.id);
|
const system = contextValue.findSystemById(parent.id);
|
||||||
if (!system) {
|
if (!system) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return await system.shuttleRepository.getShuttles();
|
return await system.shuttleRepository.getShuttles();
|
||||||
}
|
},
|
||||||
|
parkingStructures: async (_parent, _args, _contextValue, _info) => {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
parkingStructure: async (_parent, _args, _contextValue, _info) => {
|
||||||
|
return null;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
||||||
import { ETANotificationScheduler } from "../../../src/notifications/schedulers/ETANotificationScheduler";
|
import { ETANotificationScheduler } from "../../../src/notifications/schedulers/ETANotificationScheduler";
|
||||||
import { UnoptimizedInMemoryShuttleRepository } from "../../../src/repositories/UnoptimizedInMemoryShuttleRepository";
|
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 { addMockShuttleToRepository, addMockStopToRepository } from "../../testHelpers/repositorySetupHelpers";
|
||||||
import { AppleNotificationSender } from "../../../src/notifications/senders/AppleNotificationSender";
|
import { AppleNotificationSender } from "../../../src/notifications/senders/AppleNotificationSender";
|
||||||
import { InMemoryNotificationRepository } from "../../../src/repositories/InMemoryNotificationRepository";
|
import { InMemoryNotificationRepository } from "../../../src/repositories/InMemoryNotificationRepository";
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { beforeEach, describe, expect, it } from "@jest/globals";
|
import { beforeEach, describe, expect, it } from "@jest/globals";
|
||||||
import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers";
|
import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers";
|
||||||
import { IEta, IShuttle, IStop, IPassioSystem } from "../../src/entities/entities";
|
import { IEta, IShuttle, IStop } from "../../src/entities/ShuttleRepositoryEntities";
|
||||||
import {
|
import {
|
||||||
addMockEtaToRepository, addMockShuttleToRepository,
|
addMockEtaToRepository,
|
||||||
|
addMockShuttleToRepository,
|
||||||
addMockStopToRepository,
|
addMockStopToRepository,
|
||||||
} from "../testHelpers/repositorySetupHelpers";
|
} from "../testHelpers/repositorySetupHelpers";
|
||||||
import assert = require("node:assert");
|
import assert = require("node:assert");
|
||||||
@@ -22,7 +23,7 @@ describe("EtaResolvers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
async function getResponseForEtaQuery(query: string) {
|
async function getResponseForEtaQuery(query: string) {
|
||||||
const response = await holder.testServer.executeOperation({
|
return await holder.testServer.executeOperation({
|
||||||
query,
|
query,
|
||||||
variables: {
|
variables: {
|
||||||
systemId: context.systems[0].id,
|
systemId: context.systems[0].id,
|
||||||
@@ -32,7 +33,6 @@ describe("EtaResolvers", () => {
|
|||||||
contextValue: context
|
contextValue: context
|
||||||
|
|
||||||
});
|
});
|
||||||
return response;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("stop", () => {
|
describe("stop", () => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { beforeEach, describe, expect, it } from "@jest/globals";
|
import { beforeEach, describe, expect, it } from "@jest/globals";
|
||||||
import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers";
|
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 { generateMockOrderedStops, generateMockStops } from "../testHelpers/mockDataGenerators";
|
||||||
import { addMockRouteToRepository } from "../testHelpers/repositorySetupHelpers";
|
import { addMockRouteToRepository } from "../testHelpers/repositorySetupHelpers";
|
||||||
import assert = require("node:assert");
|
import assert = require("node:assert");
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { describe, expect, it } from "@jest/globals";
|
import { describe, expect, it } from "@jest/globals";
|
||||||
import { generateMockPassioSystems } from "../testHelpers/mockDataGenerators";
|
|
||||||
import {
|
import {
|
||||||
buildSystemForTesting,
|
buildSystemForTesting,
|
||||||
setupTestServerContext,
|
setupTestServerContext,
|
||||||
|
|||||||
@@ -5,14 +5,15 @@ import {
|
|||||||
addMockStopToRepository
|
addMockStopToRepository
|
||||||
} from "../testHelpers/repositorySetupHelpers";
|
} from "../testHelpers/repositorySetupHelpers";
|
||||||
import { generateMockOrderedStops, generateMockShuttles } from "../testHelpers/mockDataGenerators";
|
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 assert = require("node:assert");
|
||||||
|
import { InterchangeSystem } from "../../src/entities/InterchangeSystem";
|
||||||
|
|
||||||
describe("RouteResolvers", () => {
|
describe("RouteResolvers", () => {
|
||||||
const holder = setupTestServerHolder();
|
const holder = setupTestServerHolder();
|
||||||
const context = setupTestServerContext();
|
const context = setupTestServerContext();
|
||||||
|
|
||||||
let mockSystem: IPassioSystem;
|
let mockSystem: InterchangeSystem;
|
||||||
let mockRoute: IRoute;
|
let mockRoute: IRoute;
|
||||||
let mockStop: IStop;
|
let mockStop: IStop;
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
import { beforeEach, describe, expect, it } from "@jest/globals";
|
import { beforeEach, describe, expect, it } from "@jest/globals";
|
||||||
import { generateMockEtas, generateMockRoutes } from "../testHelpers/mockDataGenerators";
|
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 { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers";
|
||||||
import { addMockShuttleToRepository } from "../testHelpers/repositorySetupHelpers";
|
import { addMockShuttleToRepository } from "../testHelpers/repositorySetupHelpers";
|
||||||
import assert = require("node:assert");
|
import assert = require("node:assert");
|
||||||
|
import { InterchangeSystem } from "../../src/entities/InterchangeSystem";
|
||||||
|
|
||||||
|
|
||||||
describe("ShuttleResolvers", () => {
|
describe("ShuttleResolvers", () => {
|
||||||
const holder = setupTestServerHolder();
|
const holder = setupTestServerHolder();
|
||||||
const context = setupTestServerContext();
|
const context = setupTestServerContext();
|
||||||
|
|
||||||
let mockSystem: IPassioSystem;
|
let mockSystem: InterchangeSystem;
|
||||||
let mockShuttle: IShuttle;
|
let mockShuttle: IShuttle;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import {
|
|||||||
setupTestServerHolder
|
setupTestServerHolder
|
||||||
} from "../testHelpers/apolloTestServerHelpers";
|
} from "../testHelpers/apolloTestServerHelpers";
|
||||||
import { generateMockEtas, generateMockOrderedStops } from "../testHelpers/mockDataGenerators";
|
import { generateMockEtas, generateMockOrderedStops } from "../testHelpers/mockDataGenerators";
|
||||||
import { IStop } from "../../src/entities/entities";
|
import { IStop } from "../../src/entities/ShuttleRepositoryEntities";
|
||||||
import { addMockStopToRepository } from "../testHelpers/repositorySetupHelpers";
|
import { addMockStopToRepository } from "../testHelpers/repositorySetupHelpers";
|
||||||
import assert = require("node:assert");
|
import assert = require("node:assert");
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,14 @@ import {
|
|||||||
addMockShuttleToRepository,
|
addMockShuttleToRepository,
|
||||||
addMockStopToRepository,
|
addMockStopToRepository,
|
||||||
} from "../testHelpers/repositorySetupHelpers";
|
} from "../testHelpers/repositorySetupHelpers";
|
||||||
import { IPassioSystem } from "../../src/entities/entities";
|
|
||||||
import assert = require("node:assert");
|
import assert = require("node:assert");
|
||||||
|
import { InterchangeSystem } from "../../src/entities/InterchangeSystem";
|
||||||
|
|
||||||
describe("SystemResolvers", () => {
|
describe("SystemResolvers", () => {
|
||||||
const holder = setupTestServerHolder();
|
const holder = setupTestServerHolder();
|
||||||
const context = setupTestServerContext();
|
const context = setupTestServerContext();
|
||||||
|
|
||||||
let mockSystem: IPassioSystem;
|
let mockSystem: InterchangeSystem;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
mockSystem = context.systems[0];
|
mockSystem = context.systems[0];
|
||||||
|
|||||||
@@ -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
|
// Use a single set of generators in case any of the
|
||||||
// interfaces change in the future
|
// 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[] {
|
export function generateMockShuttles(): IShuttle[] {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user