graphql-engine/server/src-lib/Hasura/Server/API/Config.hs
Tom Harding e0c0043e76 Upgrade Ormolu to 0.7.0.0
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/9284
GitOrigin-RevId: 2f2cf2ad01900a54e4bdb970205ac0ef313c7e00
2023-05-24 13:53:53 +00:00

136 lines
3.8 KiB
Haskell

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE TemplateHaskell #-}
-- | API related to server configuration
module Hasura.Server.API.Config
-- required by pro
( ServerConfig (..),
runGetConfig,
)
where
import Data.Aeson.TH
import Data.HashSet qualified as Set
import Hasura.GraphQL.Execute.Subscription.Options qualified as ES
import Hasura.Prelude
import Hasura.RQL.Types.NamingCase
import Hasura.RQL.Types.Schema.Options qualified as Options
import Hasura.Server.Auth
import Hasura.Server.Auth.JWT
import Hasura.Server.Init.Config (API (METRICS), AllowListStatus)
import Hasura.Server.Init.FeatureFlag (FeatureFlag (..), getIdentifier)
import Hasura.Server.Types (ExperimentalFeature)
import Hasura.Server.Version (Version, currentVersion)
data FeatureFlagInfo = FeatureFlagInfo
{ ffiName :: Text,
ffiDescription :: Text,
ffiEnabled :: Bool
}
deriving (Show, Eq, Generic, Hashable)
$(deriveToJSON hasuraJSON ''FeatureFlagInfo)
data JWTInfo = JWTInfo
{ jwtiClaimsNamespace :: !JWTNamespace,
jwtiClaimsFormat :: !JWTClaimsFormat,
jwtiClaimsMap :: !(Maybe JWTCustomClaimsMap)
}
deriving (Show, Eq)
$(deriveToJSON hasuraJSON ''JWTInfo)
data ServerConfig = ServerConfig
{ scfgVersion :: !Version,
scfgIsFunctionPermissionsInferred :: !Options.InferFunctionPermissions,
scfgIsRemoteSchemaPermissionsEnabled :: !Options.RemoteSchemaPermissions,
scfgIsAdminSecretSet :: !Bool,
scfgIsAuthHookSet :: !Bool,
scfgIsJwtSet :: !Bool,
scfgJwt :: ![JWTInfo],
scfgIsAllowListEnabled :: !AllowListStatus,
scfgLiveQueries :: !ES.LiveQueriesOptions,
scfgStreamingQueries :: !ES.SubscriptionsOptions,
scfgConsoleAssetsDir :: !(Maybe Text),
scfgExperimentalFeatures :: !(Set.HashSet ExperimentalFeature),
scfgIsPrometheusMetricsEnabled :: !Bool,
scfgDefaultNamingConvention :: !NamingCase,
scfgFeatureFlags :: !(Set.HashSet FeatureFlagInfo)
}
deriving (Show, Eq)
$(deriveToJSON hasuraJSON ''ServerConfig)
runGetConfig ::
Options.InferFunctionPermissions ->
Options.RemoteSchemaPermissions ->
AuthMode ->
AllowListStatus ->
ES.LiveQueriesOptions ->
ES.SubscriptionsOptions ->
Maybe Text ->
Set.HashSet ExperimentalFeature ->
Set.HashSet API ->
NamingCase ->
[(FeatureFlag, Bool)] ->
ServerConfig
runGetConfig
functionPermsCtx
remoteSchemaPermsCtx
am
allowListStatus
liveQueryOpts
streamQueryOpts
consoleAssetsDir
experimentalFeatures
enabledAPIs
defaultNamingConvention
featureFlags =
ServerConfig
currentVersion
functionPermsCtx
remoteSchemaPermsCtx
(isAdminSecretSet am)
(isAuthHookSet am)
(isJWTSet am)
(getJWTInfo am)
allowListStatus
liveQueryOpts
streamQueryOpts
consoleAssetsDir
experimentalFeatures
isPrometheusMetricsEnabled
defaultNamingConvention
featureFlagSettings
where
isPrometheusMetricsEnabled = METRICS `Set.member` enabledAPIs
featureFlagSettings =
Set.fromList
$ (\(FeatureFlag {ffDescription, ffIdentifier}, enabled) -> FeatureFlagInfo {ffiName = getIdentifier ffIdentifier, ffiEnabled = enabled, ffiDescription = ffDescription})
<$> featureFlags
isAdminSecretSet :: AuthMode -> Bool
isAdminSecretSet = \case
AMNoAuth -> False
_ -> True
isAuthHookSet :: AuthMode -> Bool
isAuthHookSet = \case
AMAdminSecretAndHook _ _ -> True
_ -> False
isJWTSet :: AuthMode -> Bool
isJWTSet = \case
AMAdminSecretAndJWT {} -> True
_ -> False
getJWTInfo :: AuthMode -> [JWTInfo]
getJWTInfo (AMAdminSecretAndJWT _ jwtCtxs _) =
let f jwtCtx = case jcxClaims jwtCtx of
JCNamespace namespace claimsFormat ->
JWTInfo namespace claimsFormat Nothing
JCMap claimsMap ->
JWTInfo (ClaimNs defaultClaimsNamespace) defaultClaimsFormat $ Just claimsMap
in fmap f jwtCtxs
getJWTInfo _ = mempty