packages feed

morpheus-graphql-0.9.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(..)
                                                , failRes
                                                , liftEither
                                                )
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"



alwaysFail :: IO (Either String a)
alwaysFail = pure $ Left "fail with Either"


rootResolver :: GQLRootResolver IO EVENT Query Mutation Subscription
rootResolver = GQLRootResolver
  { queryResolver        = Query { user
                                 , testUnion = pure Nothing
                                 , fail1     = liftEither alwaysFail
                                 , fail2 =  failRes "fail with failRes"
                                 }
  , mutationResolver     = Mutation { createUser = const user }
  , subscriptionResolver = Subscription

                             { newUser = SubResolver
                                           { subChannels = [Channel]
                                           , subResolver = const user
                                           }
                             }
  }
 where
  user :: Applicative m => m (User m)
  user = pure User {   name    = pure "testName"
                     , email   = pure ""
                     , address = resolveAddress
                     , office  = resolveAddress
                     , friend  = pure Nothing
                     }
   where
    resolveAddress :: Applicative m => a -> m (Address m)
    resolveAddress _ = pure Address { city        = pure ""
                                    , houseNumber = pure 0
                                    , street      = const $ pure Nothing
                                    }

api :: GQLRequest -> IO GQLResponse
api = interpreter rootResolver