2023-01-23 16:35:48 +03:00
|
|
|
-- | 'get_feature_flag' Metadata API action. Given a feature flag
|
|
|
|
-- identifier, it returns the value of the flag and its description.
|
|
|
|
module Hasura.RQL.DDL.FeatureFlag
|
|
|
|
( -- * Get Feature Flag
|
|
|
|
GetFeatureFlag (..),
|
|
|
|
runGetFeatureFlag,
|
|
|
|
)
|
|
|
|
where
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
import Data.Aeson (FromJSON, (.:), (.=))
|
2023-04-26 20:28:48 +03:00
|
|
|
import Data.Aeson qualified as J
|
2023-01-23 16:35:48 +03:00
|
|
|
import Data.HashMap.Strict qualified as HashMap
|
|
|
|
import Hasura.Base.Error qualified as Error
|
|
|
|
import Hasura.EncJSON (EncJSON)
|
|
|
|
import Hasura.EncJSON qualified as EncJSON
|
|
|
|
import Hasura.Prelude
|
|
|
|
import Hasura.Server.Init.FeatureFlag qualified as FeatureFlag
|
|
|
|
import Hasura.Server.Types qualified as Types
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
newtype GetFeatureFlag = GetFeatureFlag {gfgIdentifier :: Text}
|
|
|
|
|
|
|
|
instance FromJSON GetFeatureFlag where
|
2023-04-26 20:28:48 +03:00
|
|
|
parseJSON = J.withObject "GetFeatureFlag" \o -> do
|
2023-01-23 16:35:48 +03:00
|
|
|
gfgIdentifier <- o .: "identifier"
|
|
|
|
pure $ GetFeatureFlag {..}
|
|
|
|
|
|
|
|
runGetFeatureFlag ::
|
|
|
|
( MonadError Error.QErr m,
|
|
|
|
MonadIO m
|
|
|
|
) =>
|
Remove `ServerConfigCtx`.
### Description
This PR removes `ServerConfigCtx` and `HasServerConfigCtx`. Instead, it favours different approaches:
- when the code was only using one field, it passes that field explicitly (usually `SQLGenCtx` or `CheckFeatureFlag`)
- when the code was using several fields, but in only one function, it inlines
- for the cache build, it introduces `CacheStaticConfig` and `CacheDynamicConfig`, which are subsets of `AppEnv` and `AppContext` respectively
The main goal of this is to help with the modularization of the engine: as `ServerConfigCtx` had fields whose types were imported from several unrelated parts of the engine, using it tied together parts of the engine that should not be aware of one another (such as tying together `Hasura.LogicalModel` and `Hasura.GraphQL.Schema`).
The bulk of this PR is a change to the cache build, as a follow up to #8509: instead of giving the entire `ServerConfigCtx` as a incremental rule argument, we only give the new `CacheDynamicConfig` struct, which has fewer fields. The other required fields, that were coming from the `AppEnv`, are now given via the `HasCacheStaticConfig` constraint, which is a "subset" of `HasAppEnv`.
(Some further work could include moving `StringifyNumbers` out of `GraphQL.Schema.Options`, given how it is used all across the codebase, including in `RQL.DML`.)
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8513
GitOrigin-RevId: 818cbcd71494e3cd946b06adbb02ca328a8a298e
2023-04-04 18:59:58 +03:00
|
|
|
Types.CheckFeatureFlag ->
|
2023-01-23 16:35:48 +03:00
|
|
|
GetFeatureFlag ->
|
|
|
|
m EncJSON
|
Remove `ServerConfigCtx`.
### Description
This PR removes `ServerConfigCtx` and `HasServerConfigCtx`. Instead, it favours different approaches:
- when the code was only using one field, it passes that field explicitly (usually `SQLGenCtx` or `CheckFeatureFlag`)
- when the code was using several fields, but in only one function, it inlines
- for the cache build, it introduces `CacheStaticConfig` and `CacheDynamicConfig`, which are subsets of `AppEnv` and `AppContext` respectively
The main goal of this is to help with the modularization of the engine: as `ServerConfigCtx` had fields whose types were imported from several unrelated parts of the engine, using it tied together parts of the engine that should not be aware of one another (such as tying together `Hasura.LogicalModel` and `Hasura.GraphQL.Schema`).
The bulk of this PR is a change to the cache build, as a follow up to #8509: instead of giving the entire `ServerConfigCtx` as a incremental rule argument, we only give the new `CacheDynamicConfig` struct, which has fewer fields. The other required fields, that were coming from the `AppEnv`, are now given via the `HasCacheStaticConfig` constraint, which is a "subset" of `HasAppEnv`.
(Some further work could include moving `StringifyNumbers` out of `GraphQL.Schema.Options`, given how it is used all across the codebase, including in `RQL.DML`.)
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8513
GitOrigin-RevId: 818cbcd71494e3cd946b06adbb02ca328a8a298e
2023-04-04 18:59:58 +03:00
|
|
|
runGetFeatureFlag (Types.CheckFeatureFlag getFeatureFlag) GetFeatureFlag {..} = do
|
2023-01-23 16:35:48 +03:00
|
|
|
let flagM = HashMap.lookup gfgIdentifier $ FeatureFlag.getFeatureFlags $ FeatureFlag.featureFlags
|
|
|
|
case flagM of
|
|
|
|
Nothing -> Error.throw400 Error.NotFound $ "Feature Flag '" <> gfgIdentifier <> "' not found"
|
|
|
|
Just flag -> do
|
2023-03-22 13:46:54 +03:00
|
|
|
flagValue <- liftIO $ getFeatureFlag flag
|
2023-01-23 16:35:48 +03:00
|
|
|
pure $
|
|
|
|
EncJSON.encJFromJValue $
|
2023-04-26 20:28:48 +03:00
|
|
|
J.object
|
2023-01-23 16:35:48 +03:00
|
|
|
[ "identifier" .= gfgIdentifier,
|
|
|
|
"value" .= flagValue,
|
|
|
|
"description" .= FeatureFlag.ffDescription flag
|
|
|
|
]
|