packages feed

morpheus-graphql-0.11.0: src/Data/Morpheus/Validation/Query/Validation.hs

{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE NamedFieldPuns         #-}
{-# LANGUAGE ScopedTypeVariables    #-}
{-# LANGUAGE TypeOperators          #-}
{-# LANGUAGE DuplicateRecordFields  #-}
{-# LANGUAGE OverloadedStrings      #-}

module Data.Morpheus.Validation.Query.Validation
  ( validateRequest
  )
where

import           Data.Map                       ( fromList )
import           Data.Morpheus.Types.Internal.AST
                                                ( Operation(..)
                                                , VALID
                                                , Schema(..)
                                                , GQLQuery(..)
                                                , VALIDATION_MODE
                                                )
import           Data.Morpheus.Types.Internal.Validation
                                                ( Context(..)
                                                , runValidator
                                                , SelectionContext(..)
                                                )
import           Data.Morpheus.Types.Internal.Resolving
                                                ( Eventless )
import           Data.Morpheus.Validation.Query.Fragment
                                                ( validateFragments )
import           Data.Morpheus.Validation.Query.Selection
                                                ( validateOperation )
import           Data.Morpheus.Validation.Query.Variable
                                                ( resolveOperationVariables )


validateRequest
  :: Schema 
  -> VALIDATION_MODE 
  -> GQLQuery 
  -> Eventless (Operation VALID)
validateRequest 
  schema 
  validationMode 
  GQLQuery 
    { fragments
    , inputVariables, 
    operation = operation@Operation 
      { operationName
      , operationSelection
      , operationPosition 
      } 
    }
  = do
      variables <- runValidator validateHelpers ctx ()
      runValidator 
        (validateOperation operation) 
        ctx 
        SelectionContext 
          { variables }
   where 
    ctx = Context 
        { schema 
        , fragments
        , scopeTypeName = "Root"
        , scopeSelectionName = "Root"
        , scopePosition = operationPosition
        , operationName
        }
    validateHelpers = 
        validateFragments operationSelection *>
        resolveOperationVariables
          (fromList inputVariables)
          validationMode
          operation