diff --git a/schema.graphqls b/schema.graphqls index a1587b2..ff2f1a9 100644 --- a/schema.graphqls +++ b/schema.graphqls @@ -1,3 +1,5 @@ +scalar DateTime + # The Interchange system schema. # Note how Passio ID and parking ID are abstracted away # from the endpoints. diff --git a/src/MergedResolvers.ts b/src/MergedResolvers.ts index 795ec38..c1925ff 100644 --- a/src/MergedResolvers.ts +++ b/src/MergedResolvers.ts @@ -1,4 +1,4 @@ -import { Coordinates, Eta, OrderedStop, Resolvers } from "./generated/graphql"; +import { Resolvers } from "./generated/graphql"; import { ServerContext } from "./ServerContext"; import { QueryResolvers } from "./resolvers/QueryResolvers"; import { SystemResolvers } from "./resolvers/SystemResolvers"; @@ -9,6 +9,7 @@ import { ShuttleResolvers } from "./resolvers/ShuttleResolvers"; import { RouteResolvers } from "./resolvers/RouteResolvers"; import { MutationResolvers } from "./resolvers/MutationResolvers"; import { ParkingSystemResolvers } from "./resolvers/ParkingSystemResolvers"; +import { DateTime } from "./scalars/DateTime"; export const MergedResolvers: Resolvers = { ...QueryResolvers, @@ -20,4 +21,5 @@ export const MergedResolvers: Resolvers = { ...OrderedStopResolvers, ...EtaResolvers, ...MutationResolvers, + DateTime: DateTime, }; diff --git a/src/scalars/DateTime.ts b/src/scalars/DateTime.ts new file mode 100644 index 0000000..45a5ac6 --- /dev/null +++ b/src/scalars/DateTime.ts @@ -0,0 +1,28 @@ +import { GraphQLScalarType } from "graphql/type"; +import { Kind } from "graphql/language"; + +// See Apollo documentation: https://www.apollographql.com/docs/apollo-server/schema/custom-scalars#providing-custom-scalars-to-apollo-server +export const DateTime = new GraphQLScalarType({ + name: 'DateTime', + description: 'DateTime custom scalar type', + serialize(value) { + if (value instanceof Date) { + return value.getTime(); + } else if (value instanceof Number) { + return value; + } + throw Error('GraphQL Date Scalar serializer expected a `Date` object or number'); + }, + parseValue(value) { + if (typeof value === 'number') { + return new Date(value); + } + throw new Error('GraphQL Date Scalar parser expected a `number`'); + }, + parseLiteral(ast) { + if (ast.kind === Kind.INT) { + return new Date(parseInt(ast.value, 10)); + } + return null; + }, +})