morpheus-graphql-core-0.13.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
( CurrentSelection (..),
OperationContext (..),
Scope (..),
ScopeKind (..),
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 variables)
where
ctx variables =
OperationContext
{ schema,
fragments,
scope = Scope {typename = "Root", position = operationPosition, kind = SELECTION},
selection = CurrentSelection {operationName, selectionName = "Root"},
variables
}
validateHelpers =
validateFragments operationSelection
*> resolveOperationVariables
(fromList inputVariables)
validationMode
operation