graphql-engine/server/src-lib/Hasura/GraphQL/Execute/Common.hs
Brandon Simmons b167120f96 server: add explicit export lists in OSS server and enforce with warning
We'll see if this improves compile times at all, but I think it's worth
doing as at least the most minimal form of module documentation.

This was accomplished by first compiling everything with
-ddump-minimal-imports, and then a bunch of scripting (with help from
ormolu)

**EDIT** it doesn't seem to improve CI compile times but the noise floor is high as it looks like we're not caching library dependencies anymore

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/2730
GitOrigin-RevId: 667eb8de1e0f1af70420cbec90402922b8b84cb4
2021-11-04 16:09:38 +00:00

74 lines
2.8 KiB
Haskell

module Hasura.GraphQL.Execute.Common
( MonadGQLExecutionCheck (..),
)
where
import Data.Aeson.Ordered qualified as JO
import Hasura.Base.Error
import Hasura.GraphQL.Execute.Backend
import Hasura.GraphQL.Transport.HTTP.Protocol
import Hasura.Metadata.Class
import Hasura.Prelude
import Hasura.RQL.Types
import Hasura.Session
import Hasura.Tracing qualified as Tracing
import Network.HTTP.Types qualified as HTTP
import Network.Wai.Extended qualified as Wai
-- | Typeclass representing safety checks (if any) that need to be performed
-- before a GraphQL query should be allowed to be executed. In OSS, the safety
-- check is to check in the query is in the allow list.
--
-- the `executeIntrospection` function has different implementations in OSS and
-- Pro. In Pro, the GraphQL schema introspection can be disabled for specified
-- roles and in OSS there is no restrictions.
--
-- | TODO (from master): Limitation: This parses the query, which is not ideal if we already
-- have the query cached. The parsing happens unnecessary. But getting this to
-- either return a plan or parse was tricky and complicated.
class Monad m => MonadGQLExecutionCheck m where
checkGQLExecution ::
UserInfo ->
([HTTP.Header], Wai.IpAddress) ->
-- | allow list enabled?
Bool ->
-- | needs allow list
SchemaCache ->
-- | the unparsed GraphQL query string (and related values)
GQLReqUnparsed ->
m (Either QErr GQLReqParsed)
executeIntrospection ::
UserInfo ->
JO.Value ->
SetGraphqlIntrospectionOptions ->
m (Either QErr ExecutionStep)
instance MonadGQLExecutionCheck m => MonadGQLExecutionCheck (ExceptT e m) where
checkGQLExecution ui det enableAL sc req =
lift $ checkGQLExecution ui det enableAL sc req
executeIntrospection userInfo introspectionQuery rolesDisabled =
lift $ executeIntrospection userInfo introspectionQuery rolesDisabled
instance MonadGQLExecutionCheck m => MonadGQLExecutionCheck (ReaderT r m) where
checkGQLExecution ui det enableAL sc req =
lift $ checkGQLExecution ui det enableAL sc req
executeIntrospection userInfo introspectionQuery rolesDisabled =
lift $ executeIntrospection userInfo introspectionQuery rolesDisabled
instance MonadGQLExecutionCheck m => MonadGQLExecutionCheck (Tracing.TraceT m) where
checkGQLExecution ui det enableAL sc req =
lift $ checkGQLExecution ui det enableAL sc req
executeIntrospection userInfo introspectionQuery rolesDisabled =
lift $ executeIntrospection userInfo introspectionQuery rolesDisabled
instance MonadGQLExecutionCheck m => MonadGQLExecutionCheck (MetadataStorageT m) where
checkGQLExecution ui det enableAL sc req =
lift $ checkGQLExecution ui det enableAL sc req
executeIntrospection userInfo introspectionQuery rolesDisabled =
lift $ executeIntrospection userInfo introspectionQuery rolesDisabled