morpheus-graphql-0.5.0: test/Feature/Holistic/API.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Feature.Holistic.API
( api
, rootResolver
) where
import Data.Morpheus (interpreter)
import Data.Morpheus.Document (importGQLDocument)
import Data.Morpheus.Kind (SCALAR)
import Data.Morpheus.Types (Event, GQLRequest, GQLResponse, GQLRootResolver (..), GQLScalar (..),
GQLType (..), ID (..), ScalarValue (..), Resolver (..), constRes )
import Data.Text (Text)
import GHC.Generics (Generic)
data TestScalar =
TestScalar Int
Int
deriving (Show, Generic)
instance GQLType TestScalar where
type KIND TestScalar = SCALAR
instance GQLScalar TestScalar where
parseValue _ = pure (TestScalar 1 0)
serialize (TestScalar x y) = Int (x * 100 + y)
data Channel =
Channel
deriving (Show, Eq)
type EVENT = Event Channel ()
importGQLDocument "test/Feature/Holistic/API.gql"
rootResolver ::
GQLRootResolver IO EVENT Query Mutation Subscription
rootResolver =
GQLRootResolver
{ queryResolver = Query {user, testUnion = constRes Nothing}
, mutationResolver = Mutation {createUser = user}
, subscriptionResolver = Subscription {newUser = const SubResolver {subChannels = [Channel], subResolver = user}}
}
where
user _ =
pure
User
{ name = constRes "testName"
, email = constRes ""
, address = resolveAddress
, office = resolveAddress
, friend = constRes Nothing
}
where
resolveAddress _ =
pure Address {city = constRes "", houseNumber = constRes 0, street = constRes Nothing}
api :: GQLRequest -> IO GQLResponse
api = interpreter rootResolver