2023-03-17 13:29:07 +03:00
|
|
|
{-# LANGUAGE Arrows #-}
|
|
|
|
|
2023-02-24 21:09:36 +03:00
|
|
|
module Hasura.App.State
|
Clean `AppEnv` and `AppContext` passing, remove `RunT`, reduce `ServerConfigCtx` uses
## Description
This PR does several different things that happen to overlap; the most important being:
- it removes `RunT`: it was redundant in places where we already had `Handler`, and only used in one other place, `SchemaUpdate`, for which a local `SchemaUpdateT` is more than enough;
- it reduces the number of places where we create a `ServerConfigCtx`, since now `HasServerConfigCtx` can be implemented directly by `SchemaUpdateT` and `Handler` based on the full `AppContext`;
- it drastically reduces the number of arguments we pass around in the app init code, by introducing `HasAppEnv`;
- it simplifies `HandlerCtx` to reduce duplication
In doing so, this changes paves the way towards removing `ServerConfigCtx`, since there are only very few places where we construct it: we can now introduce smaller classes than `HasServerConfigCtx`, that expose only a relevant subset of fields, and implement them where we now implement `HasServerConfigCtx`.
This PR is loosely based on ideas in #8337, that are no longer applicable due to the changes introduced in #8159. A challenge of this PR was the postgres tests, which were running in `PGMetadataStorageAppT CacheBuild` :scream_cat:
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8392
GitOrigin-RevId: b90c1359066d20dbea329c87762ccdd1217b4d69
2023-03-21 13:44:21 +03:00
|
|
|
( -- * application state
|
|
|
|
RebuildableAppContext (..),
|
2023-03-17 13:29:07 +03:00
|
|
|
AppEnv (..),
|
2023-02-24 21:09:36 +03:00
|
|
|
AppContext (..),
|
|
|
|
Loggers (..),
|
Clean `AppEnv` and `AppContext` passing, remove `RunT`, reduce `ServerConfigCtx` uses
## Description
This PR does several different things that happen to overlap; the most important being:
- it removes `RunT`: it was redundant in places where we already had `Handler`, and only used in one other place, `SchemaUpdate`, for which a local `SchemaUpdateT` is more than enough;
- it reduces the number of places where we create a `ServerConfigCtx`, since now `HasServerConfigCtx` can be implemented directly by `SchemaUpdateT` and `Handler` based on the full `AppContext`;
- it drastically reduces the number of arguments we pass around in the app init code, by introducing `HasAppEnv`;
- it simplifies `HandlerCtx` to reduce duplication
In doing so, this changes paves the way towards removing `ServerConfigCtx`, since there are only very few places where we construct it: we can now introduce smaller classes than `HasServerConfigCtx`, that expose only a relevant subset of fields, and implement them where we now implement `HasServerConfigCtx`.
This PR is loosely based on ideas in #8337, that are no longer applicable due to the changes introduced in #8159. A challenge of this PR was the postgres tests, which were running in `PGMetadataStorageAppT CacheBuild` :scream_cat:
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8392
GitOrigin-RevId: b90c1359066d20dbea329c87762ccdd1217b4d69
2023-03-21 13:44:21 +03:00
|
|
|
|
|
|
|
-- * env access
|
|
|
|
HasAppEnv (..),
|
|
|
|
|
|
|
|
-- * init functions
|
2023-03-17 13:29:07 +03:00
|
|
|
buildRebuildableAppContext,
|
|
|
|
initSQLGenCtx,
|
2023-02-24 21:09:36 +03:00
|
|
|
)
|
|
|
|
where
|
|
|
|
|
2023-03-17 13:29:07 +03:00
|
|
|
import Control.Arrow.Extended
|
2023-02-24 21:09:36 +03:00
|
|
|
import Control.Concurrent.STM qualified as STM
|
2023-03-17 13:29:07 +03:00
|
|
|
import Control.Monad.Trans.Control (MonadBaseControl)
|
|
|
|
import Data.Environment qualified as E
|
|
|
|
import Data.HashSet qualified as Set
|
2023-02-24 21:09:36 +03:00
|
|
|
import Database.PG.Query qualified as PG
|
2023-03-17 13:29:07 +03:00
|
|
|
import Hasura.Base.Error
|
2023-02-24 21:09:36 +03:00
|
|
|
import Hasura.Eventing.Common (LockedEventsCtx)
|
2023-03-17 13:29:07 +03:00
|
|
|
import Hasura.Eventing.EventTrigger
|
2023-02-24 21:09:36 +03:00
|
|
|
import Hasura.GraphQL.Execute.Subscription.Options
|
|
|
|
import Hasura.GraphQL.Execute.Subscription.State qualified as ES
|
|
|
|
import Hasura.GraphQL.Schema.NamingCase
|
|
|
|
import Hasura.GraphQL.Schema.Options qualified as Options
|
2023-03-17 13:29:07 +03:00
|
|
|
import Hasura.Incremental qualified as Inc
|
2023-02-24 21:09:36 +03:00
|
|
|
import Hasura.Logging qualified as L
|
|
|
|
import Hasura.Prelude
|
|
|
|
import Hasura.RQL.Types.Common
|
|
|
|
import Hasura.RQL.Types.Metadata
|
|
|
|
import Hasura.RQL.Types.SchemaCache (MetadataResourceVersion)
|
2023-03-17 13:29:07 +03:00
|
|
|
import Hasura.Server.Auth
|
2023-02-28 12:09:31 +03:00
|
|
|
import Hasura.Server.Cors qualified as Cors
|
2023-02-24 21:09:36 +03:00
|
|
|
import Hasura.Server.Init
|
|
|
|
import Hasura.Server.Logging
|
|
|
|
import Hasura.Server.Metrics
|
|
|
|
import Hasura.Server.Prometheus
|
|
|
|
import Hasura.Server.Types
|
2023-03-17 13:29:07 +03:00
|
|
|
import Hasura.Session
|
2023-02-24 21:09:36 +03:00
|
|
|
import Hasura.ShutdownLatch
|
|
|
|
import Hasura.Tracing qualified as Tracing
|
|
|
|
import Network.HTTP.Client qualified as HTTP
|
2023-02-28 12:09:31 +03:00
|
|
|
import Network.Wai.Handler.Warp (HostPreference)
|
|
|
|
import Network.WebSockets.Connection qualified as WebSockets
|
2023-03-17 13:29:07 +03:00
|
|
|
import Refined (NonNegative, Refined)
|
2023-02-24 21:09:36 +03:00
|
|
|
|
Clean `AppEnv` and `AppContext` passing, remove `RunT`, reduce `ServerConfigCtx` uses
## Description
This PR does several different things that happen to overlap; the most important being:
- it removes `RunT`: it was redundant in places where we already had `Handler`, and only used in one other place, `SchemaUpdate`, for which a local `SchemaUpdateT` is more than enough;
- it reduces the number of places where we create a `ServerConfigCtx`, since now `HasServerConfigCtx` can be implemented directly by `SchemaUpdateT` and `Handler` based on the full `AppContext`;
- it drastically reduces the number of arguments we pass around in the app init code, by introducing `HasAppEnv`;
- it simplifies `HandlerCtx` to reduce duplication
In doing so, this changes paves the way towards removing `ServerConfigCtx`, since there are only very few places where we construct it: we can now introduce smaller classes than `HasServerConfigCtx`, that expose only a relevant subset of fields, and implement them where we now implement `HasServerConfigCtx`.
This PR is loosely based on ideas in #8337, that are no longer applicable due to the changes introduced in #8159. A challenge of this PR was the postgres tests, which were running in `PGMetadataStorageAppT CacheBuild` :scream_cat:
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8392
GitOrigin-RevId: b90c1359066d20dbea329c87762ccdd1217b4d69
2023-03-21 13:44:21 +03:00
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- application state
|
|
|
|
|
2023-02-24 21:09:36 +03:00
|
|
|
{- Note [Hasura Application State]
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Hasura Application state represents the entire state of hasura.
|
|
|
|
|
|
|
|
Hasura Application State = AppEnv (static) + AppContext (dynamic)
|
|
|
|
|
|
|
|
Hasura Application State can be divided into two parts:
|
|
|
|
|
|
|
|
1. Read-Only State (Static State):
|
|
|
|
=================================
|
|
|
|
The information required to build this state is provided only during the
|
|
|
|
initialization of hasura. This information is immutable. If you want update any
|
|
|
|
field in this state, you would need to shutdown the current instance and
|
|
|
|
re-launch hausura with new information.
|
|
|
|
|
|
|
|
Eg: If you want to run hasura in read-only mode, you would have to mention
|
|
|
|
this information when hasura starts up. There is no way to make hasura
|
|
|
|
run in read-only mode once it has booted up.
|
|
|
|
|
|
|
|
2. Runtime Configurable State (Dynamic State):
|
|
|
|
==============================================
|
|
|
|
The information present in this state can be updated during the runtime. This state
|
|
|
|
is mutable and does not require a restart of hasura instance to take effect.
|
|
|
|
|
|
|
|
The fields in the state are usually updated via Metadata API's or Hasura Console.
|
|
|
|
|
|
|
|
Eg: You can change the entries in Allowlist via console and hasura need not restart
|
|
|
|
for the changes to take effect.
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
2023-03-17 13:29:07 +03:00
|
|
|
data RebuildableAppContext impl = RebuildableAppContext
|
|
|
|
{ lastBuiltAppContext :: AppContext,
|
|
|
|
_racInvalidationMap :: InvalidationKeys,
|
|
|
|
_racRebuild :: Inc.Rule (ReaderT (L.Logger L.Hasura, HTTP.Manager) (ExceptT QErr IO)) (ServeOptions impl, E.Environment, InvalidationKeys) AppContext
|
|
|
|
}
|
|
|
|
|
2023-02-24 21:09:36 +03:00
|
|
|
-- | Represents the Read-Only Hasura State, these fields are immutable and the state
|
|
|
|
-- cannot be changed during runtime.
|
|
|
|
data AppEnv = AppEnv
|
2023-02-28 12:09:31 +03:00
|
|
|
{ appEnvPort :: Port,
|
|
|
|
appEnvHost :: HostPreference,
|
|
|
|
appEnvMetadataDbPool :: PG.PGPool,
|
2023-02-24 21:09:36 +03:00
|
|
|
appEnvManager :: HTTP.Manager,
|
|
|
|
appEnvLoggers :: Loggers,
|
|
|
|
appEnvMetadataVersionRef :: STM.TMVar MetadataResourceVersion,
|
|
|
|
appEnvInstanceId :: InstanceId,
|
2023-02-28 12:09:31 +03:00
|
|
|
appEnvEnableMaintenanceMode :: MaintenanceMode (),
|
2023-02-24 21:09:36 +03:00
|
|
|
appEnvLoggingSettings :: LoggingSettings,
|
|
|
|
appEnvEventingMode :: EventingMode,
|
|
|
|
appEnvEnableReadOnlyMode :: ReadOnlyMode,
|
|
|
|
appEnvServerMetrics :: ServerMetrics,
|
|
|
|
appEnvShutdownLatch :: ShutdownLatch,
|
|
|
|
appEnvMetaVersionRef :: STM.TMVar MetadataResourceVersion,
|
|
|
|
appEnvPrometheusMetrics :: PrometheusMetrics,
|
|
|
|
appEnvTraceSamplingPolicy :: Tracing.SamplingPolicy,
|
|
|
|
appEnvSubscriptionState :: ES.SubscriptionsState,
|
|
|
|
appEnvLockedEventsCtx :: LockedEventsCtx,
|
2023-02-28 12:09:31 +03:00
|
|
|
appEnvConnParams :: PG.ConnParams,
|
|
|
|
appEnvTxIso :: PG.TxIsolation,
|
|
|
|
appEnvConsoleAssetsDir :: Maybe Text,
|
|
|
|
appEnvConsoleSentryDsn :: Maybe Text,
|
|
|
|
appEnvConnectionOptions :: WebSockets.ConnectionOptions,
|
|
|
|
appEnvWebSocketKeepAlive :: KeepAliveDelay,
|
|
|
|
appEnvWebSocketConnectionInitTimeout :: WSConnectionInitTimeout,
|
|
|
|
appEnvGracefulShutdownTimeout :: Refined NonNegative Seconds,
|
2023-03-17 13:29:07 +03:00
|
|
|
-- TODO: Move this to `ServerContext`. We are leaving this for now as this cannot be changed directly
|
|
|
|
-- by the user on the cloud dashboard and will also require a refactor in HasuraPro/App.hs
|
|
|
|
-- as this thread is initialised there before creating the `AppStateRef`. But eventually we need
|
|
|
|
-- to do it for the Enterprise version.
|
|
|
|
appEnvSchemaPollInterval :: OptionalInterval,
|
2023-03-22 13:46:54 +03:00
|
|
|
appEnvCheckFeatureFlag :: CheckFeatureFlag
|
2023-02-24 21:09:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
-- | Represents the Dynamic Hasura State, these field are mutable and can be changed
|
|
|
|
-- during runtime.
|
|
|
|
data AppContext = AppContext
|
2023-03-17 13:29:07 +03:00
|
|
|
{ acAuthMode :: AuthMode,
|
2023-02-24 21:09:36 +03:00
|
|
|
acSQLGenCtx :: SQLGenCtx,
|
2023-03-17 13:29:07 +03:00
|
|
|
acEnabledAPIs :: Set.HashSet API,
|
2023-02-24 21:09:36 +03:00
|
|
|
acEnableAllowlist :: AllowListStatus,
|
|
|
|
acResponseInternalErrorsConfig :: ResponseInternalErrorsConfig,
|
2023-03-17 13:29:07 +03:00
|
|
|
acEnvironment :: E.Environment,
|
2023-02-24 21:09:36 +03:00
|
|
|
acRemoteSchemaPermsCtx :: Options.RemoteSchemaPermissions,
|
|
|
|
acFunctionPermsCtx :: Options.InferFunctionPermissions,
|
2023-03-17 13:29:07 +03:00
|
|
|
acExperimentalFeatures :: Set.HashSet ExperimentalFeature,
|
2023-02-28 12:09:31 +03:00
|
|
|
acDefaultNamingConvention :: NamingCase,
|
2023-02-24 21:09:36 +03:00
|
|
|
acMetadataDefaults :: MetadataDefaults,
|
|
|
|
acLiveQueryOptions :: LiveQueriesOptions,
|
2023-02-28 12:09:31 +03:00
|
|
|
acStreamQueryOptions :: StreamQueriesOptions,
|
2023-03-17 13:29:07 +03:00
|
|
|
acCorsPolicy :: Cors.CorsPolicy,
|
2023-02-28 12:09:31 +03:00
|
|
|
acConsoleStatus :: ConsoleStatus,
|
|
|
|
acEnableTelemetry :: TelemetryStatus,
|
2023-03-17 13:29:07 +03:00
|
|
|
acEventEngineCtx :: EventEngineCtx,
|
2023-02-28 12:09:31 +03:00
|
|
|
acAsyncActionsFetchInterval :: OptionalInterval,
|
2023-03-15 11:14:20 +03:00
|
|
|
acApolloFederationStatus :: ApolloFederationStatus
|
2023-02-24 21:09:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
-- | Collection of the LoggerCtx, the regular Logger and the PGLogger
|
|
|
|
data Loggers = Loggers
|
|
|
|
{ _lsLoggerCtx :: L.LoggerCtx L.Hasura,
|
|
|
|
_lsLogger :: L.Logger L.Hasura,
|
|
|
|
_lsPgLogger :: PG.PGLogger
|
|
|
|
}
|
2023-03-17 13:29:07 +03:00
|
|
|
|
|
|
|
data InvalidationKeys = InvalidationKeys
|
|
|
|
|
Clean `AppEnv` and `AppContext` passing, remove `RunT`, reduce `ServerConfigCtx` uses
## Description
This PR does several different things that happen to overlap; the most important being:
- it removes `RunT`: it was redundant in places where we already had `Handler`, and only used in one other place, `SchemaUpdate`, for which a local `SchemaUpdateT` is more than enough;
- it reduces the number of places where we create a `ServerConfigCtx`, since now `HasServerConfigCtx` can be implemented directly by `SchemaUpdateT` and `Handler` based on the full `AppContext`;
- it drastically reduces the number of arguments we pass around in the app init code, by introducing `HasAppEnv`;
- it simplifies `HandlerCtx` to reduce duplication
In doing so, this changes paves the way towards removing `ServerConfigCtx`, since there are only very few places where we construct it: we can now introduce smaller classes than `HasServerConfigCtx`, that expose only a relevant subset of fields, and implement them where we now implement `HasServerConfigCtx`.
This PR is loosely based on ideas in #8337, that are no longer applicable due to the changes introduced in #8159. A challenge of this PR was the postgres tests, which were running in `PGMetadataStorageAppT CacheBuild` :scream_cat:
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8392
GitOrigin-RevId: b90c1359066d20dbea329c87762ccdd1217b4d69
2023-03-21 13:44:21 +03:00
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- env access
|
|
|
|
|
|
|
|
-- | Provides access to the 'AppEnv'.
|
|
|
|
--
|
|
|
|
-- This class is nothing more than an equivalent of @MonadReader AppEnv m@, but
|
|
|
|
-- it abstracts it, so that application code can be written without explicitly
|
|
|
|
-- relying on an explicit implementation of the app monad. It allows for the app
|
|
|
|
-- env to be passed implicitly instead of explictly in all of the app init code.
|
|
|
|
--
|
|
|
|
-- This class is not meant to be used across the entirety of the codebase, as
|
|
|
|
-- using it brings in scope the types of all fields, creating dependencies
|
|
|
|
-- between unrelated parts of the codebase. It is only meant to be used at the
|
|
|
|
-- top level; more specific parts of the code should only rely on the relevant
|
|
|
|
-- subset of the environment, exposed by small, local typeclasses. For instance,
|
|
|
|
-- at time of writing, this can be used to implement 'HasServerConfigCtx', as a
|
|
|
|
-- first step towards breaking it down.
|
|
|
|
class Monad m => HasAppEnv m where
|
|
|
|
askAppEnv :: m AppEnv
|
|
|
|
|
|
|
|
instance (HasAppEnv m) => HasAppEnv (ReaderT r m) where
|
|
|
|
askAppEnv = lift askAppEnv
|
|
|
|
|
|
|
|
instance (HasAppEnv m) => HasAppEnv (ExceptT e m) where
|
|
|
|
askAppEnv = lift askAppEnv
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- init functions
|
|
|
|
|
2023-03-17 13:29:07 +03:00
|
|
|
initInvalidationKeys :: InvalidationKeys
|
|
|
|
initInvalidationKeys = InvalidationKeys
|
|
|
|
|
|
|
|
-- | Function to build the 'AppContext' (given the 'ServeOptions') for the first
|
|
|
|
-- time
|
|
|
|
buildRebuildableAppContext :: (L.Logger L.Hasura, HTTP.Manager) -> ServeOptions impl -> E.Environment -> ExceptT QErr IO (RebuildableAppContext impl)
|
|
|
|
buildRebuildableAppContext readerContext serveOptions env = do
|
|
|
|
result <- flip runReaderT readerContext $ Inc.build (buildAppContextRule) (serveOptions, env, initInvalidationKeys)
|
|
|
|
let !appContext = Inc.result result
|
|
|
|
let !rebuildableAppContext = RebuildableAppContext appContext initInvalidationKeys (Inc.rebuildRule result)
|
|
|
|
pure rebuildableAppContext
|
|
|
|
|
|
|
|
buildAppContextRule ::
|
|
|
|
forall arr m impl.
|
|
|
|
( ArrowChoice arr,
|
|
|
|
Inc.ArrowCache m arr,
|
|
|
|
MonadBaseControl IO m,
|
|
|
|
MonadIO m,
|
|
|
|
MonadError QErr m,
|
|
|
|
MonadReader (L.Logger L.Hasura, HTTP.Manager) m
|
|
|
|
) =>
|
|
|
|
(ServeOptions impl, E.Environment, InvalidationKeys) `arr` AppContext
|
|
|
|
buildAppContextRule = proc (ServeOptions {..}, env, _keys) -> do
|
|
|
|
authMode <- buildAuthMode -< (soAdminSecret, soAuthHook, soJwtSecret, soUnAuthRole)
|
|
|
|
sqlGenCtx <- buildSqlGenCtx -< (soExperimentalFeatures, soStringifyNum, soDangerousBooleanCollapse)
|
|
|
|
responseInternalErrorsConfig <- buildResponseInternalErrorsConfig -< (soAdminInternalErrors, soDevMode)
|
|
|
|
eventEngineCtx <- buildEventEngineCtx -< (soEventsHttpPoolSize, soEventsFetchInterval, soEventsFetchBatchSize)
|
|
|
|
returnA
|
|
|
|
-<
|
|
|
|
AppContext
|
|
|
|
{ acAuthMode = authMode,
|
|
|
|
acSQLGenCtx = sqlGenCtx,
|
|
|
|
acEnabledAPIs = soEnabledAPIs,
|
|
|
|
acEnableAllowlist = soEnableAllowList,
|
|
|
|
acResponseInternalErrorsConfig = responseInternalErrorsConfig,
|
|
|
|
acEnvironment = env,
|
|
|
|
acRemoteSchemaPermsCtx = soEnableRemoteSchemaPermissions,
|
|
|
|
acFunctionPermsCtx = soInferFunctionPermissions,
|
|
|
|
acExperimentalFeatures = soExperimentalFeatures,
|
|
|
|
acDefaultNamingConvention = soDefaultNamingConvention,
|
|
|
|
acMetadataDefaults = soMetadataDefaults,
|
|
|
|
acLiveQueryOptions = soLiveQueryOpts,
|
|
|
|
acStreamQueryOptions = soStreamingQueryOpts,
|
|
|
|
acCorsPolicy = Cors.mkDefaultCorsPolicy soCorsConfig,
|
|
|
|
acConsoleStatus = soConsoleStatus,
|
|
|
|
acEnableTelemetry = soEnableTelemetry,
|
|
|
|
acEventEngineCtx = eventEngineCtx,
|
|
|
|
acAsyncActionsFetchInterval = soAsyncActionsFetchInterval,
|
|
|
|
acApolloFederationStatus = soApolloFederationStatus
|
|
|
|
}
|
|
|
|
where
|
|
|
|
buildSqlGenCtx = Inc.cache proc (experimentalFeatures, stringifyNum, dangerousBooleanCollapse) -> do
|
|
|
|
let sqlGenCtx = initSQLGenCtx experimentalFeatures stringifyNum dangerousBooleanCollapse
|
|
|
|
returnA -< sqlGenCtx
|
|
|
|
|
|
|
|
buildEventEngineCtx = Inc.cache proc (httpPoolSize, fetchInterval, fetchBatchSize) -> do
|
|
|
|
eventEngineCtx <- bindA -< initEventEngineCtx httpPoolSize fetchInterval fetchBatchSize
|
|
|
|
returnA -< eventEngineCtx
|
|
|
|
|
|
|
|
buildAuthMode :: (Set.HashSet AdminSecretHash, Maybe AuthHook, [JWTConfig], Maybe RoleName) `arr` AuthMode
|
|
|
|
buildAuthMode = Inc.cache proc (adminSecretHashSet, webHook, jwtSecrets, unAuthRole) -> do
|
|
|
|
authMode <-
|
|
|
|
bindA
|
|
|
|
-< do
|
|
|
|
(logger, httpManager) <- ask
|
|
|
|
authModeRes <-
|
|
|
|
runExceptT $
|
|
|
|
setupAuthMode
|
|
|
|
adminSecretHashSet
|
|
|
|
webHook
|
|
|
|
jwtSecrets
|
|
|
|
unAuthRole
|
|
|
|
logger
|
|
|
|
httpManager
|
|
|
|
onLeft authModeRes throw500
|
|
|
|
returnA -< authMode
|
|
|
|
|
|
|
|
buildResponseInternalErrorsConfig :: (AdminInternalErrorsStatus, DevModeStatus) `arr` ResponseInternalErrorsConfig
|
|
|
|
buildResponseInternalErrorsConfig = Inc.cache proc (adminInternalErrors, devMode) -> do
|
|
|
|
let responseInternalErrorsConfig =
|
|
|
|
if
|
|
|
|
| isDevModeEnabled devMode -> InternalErrorsAllRequests
|
|
|
|
| isAdminInternalErrorsEnabled adminInternalErrors -> InternalErrorsAdminOnly
|
|
|
|
| otherwise -> InternalErrorsDisabled
|
|
|
|
returnA -< responseInternalErrorsConfig
|
|
|
|
|
|
|
|
initSQLGenCtx :: HashSet ExperimentalFeature -> Options.StringifyNumbers -> Options.DangerouslyCollapseBooleans -> SQLGenCtx
|
|
|
|
initSQLGenCtx experimentalFeatures stringifyNum dangerousBooleanCollapse =
|
|
|
|
let optimizePermissionFilters
|
|
|
|
| EFOptimizePermissionFilters `elem` experimentalFeatures = Options.OptimizePermissionFilters
|
|
|
|
| otherwise = Options.Don'tOptimizePermissionFilters
|
|
|
|
|
|
|
|
bigqueryStringNumericInput
|
|
|
|
| EFBigQueryStringNumericInput `elem` experimentalFeatures = Options.EnableBigQueryStringNumericInput
|
|
|
|
| otherwise = Options.DisableBigQueryStringNumericInput
|
|
|
|
in SQLGenCtx stringifyNum dangerousBooleanCollapse optimizePermissionFilters bigqueryStringNumericInput
|