morpheus-graphql-core-0.12.0: src/Data/Morpheus/Validation/Query/Validation.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Data.Morpheus.Validation.Query.Validation
( validateRequest,
)
where
import Data.HashMap.Lazy (fromList)
import Data.Morpheus.Types.Internal.AST
( GQLQuery (..),
Operation (..),
Schema (..),
VALID,
VALIDATION_MODE,
)
import Data.Morpheus.Types.Internal.Resolving
( Eventless,
)
import Data.Morpheus.Types.Internal.Validation
( Context (..),
ScopeKind (..),
SelectionContext (..),
runValidator,
)
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,
scopeKind = SELECTION
}
validateHelpers =
validateFragments operationSelection
*> resolveOperationVariables
(fromList inputVariables)
validationMode
operation