import { Resolvers } from "../generated/graphql"; import { ServerContext } from "../ServerContext"; import { HistoricalParkingAverageQueryArguments } from "../repositories/parking/ParkingGetterRepository"; import { GraphQLError } from "graphql/error"; import { PARKING_HISTORICAL_AVERAGE_MAXIMUM_TIMESPAN, PARKING_HISTORICAL_AVERAGE_MINIMUM_INTERVAL } from "../environment"; export const ParkingStructureResolvers: Resolvers = { ParkingStructure: { historicalAverages: async (parent, args, contextValue, _info) => { /** * @param errorMessage */ function throwBadUserInputError(errorMessage: string) { throw new GraphQLError(errorMessage, { extensions: { code: 'BAD_USER_INPUT', } }); } const system = contextValue.findSystemById(parent.systemId); if (!args.input?.intervalMs) { throwBadUserInputError('No interval provided'); return null; } const queryArguments: HistoricalParkingAverageQueryArguments = { from: new Date(args.input.from), intervalMs: args.input.intervalMs, to: new Date(args.input.to), } if (Number.isNaN(queryArguments.from.getTime() || Number.isNaN(queryArguments.to.getTime()))) { throwBadUserInputError('One or more incorrect dates provided'); } if (queryArguments.from.getTime() > queryArguments.to.getTime()) { throwBadUserInputError("`from` date can't be greater than the `to` date"); } // Limit queries for improved performance if (queryArguments.to.getTime() - queryArguments.from.getTime() > PARKING_HISTORICAL_AVERAGE_MAXIMUM_TIMESPAN) { throwBadUserInputError('Maximum timespan exceeded'); } if (queryArguments.intervalMs < PARKING_HISTORICAL_AVERAGE_MINIMUM_INTERVAL) { throwBadUserInputError('Provided interval is less than minimum interval'); } const parkingAverages = await system?.parkingRepository?.getHistoricalAveragesOfParkingStructureCounts(parent.id, queryArguments); if (!parkingAverages) { return null; } return parkingAverages; } } }