mirror of
https://github.com/brendan-ch/project-inter-server.git
synced 2026-04-17 07:50:31 +00:00
60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
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<ServerContext> = {
|
|
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;
|
|
}
|
|
}
|
|
}
|