morpheus-graphql-0.7.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/schema.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