graphql-engine/server/src-lib/Hasura/Server/Init/FeatureFlag.hs
Gil Mizrahi 625e41cd77 rename naqi to logimo part 3 - data types
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8068
GitOrigin-RevId: 435527a98e645ed69c9be484ff0bd21af8181d69
2023-02-22 13:46:54 +00:00

76 lines
2.3 KiB
Haskell

{-# LANGUAGE DeriveAnyClass #-}
-- | Feature Flags are /temporary/ toggles.
module Hasura.Server.Init.FeatureFlag
( FeatureFlag (..),
checkFeatureFlag,
Identifier (..),
FeatureFlags (..),
featureFlags,
logicalModelInterface,
)
where
--------------------------------------------------------------------------------
import Data.Aeson (FromJSON, ToJSON)
import Data.Environment qualified as Env
import Data.HashMap.Strict qualified as HashMap
import Hasura.Prelude
--------------------------------------------------------------------------------
newtype Identifier = Identifier {getIdentifier :: Text}
deriving stock (Generic)
deriving newtype (Eq, FromJSON, ToJSON)
deriving anyclass (Hashable)
data FeatureFlag = FeatureFlag
{ ffIdentifier :: Identifier,
ffDefaultValue :: Bool,
ffDescription :: Text,
ffEnvVar :: String
}
deriving stock (Eq, Generic)
deriving anyclass (Hashable, FromJSON, ToJSON)
-- | In OSS we look for a environment variable or fall back to the default
-- value
checkFeatureFlag :: Env.Environment -> FeatureFlag -> IO Bool
checkFeatureFlag env (FeatureFlag {ffEnvVar = envVar, ffDefaultValue = defaultValue}) =
case Env.lookupEnv env envVar of
Just found -> pure $ fromMaybe defaultValue (readMaybe found)
Nothing -> pure $ defaultValue
--------------------------------------------------------------------------------
newtype FeatureFlags = FeatureFlags {getFeatureFlags :: HashMap Text FeatureFlag}
featureFlags :: FeatureFlags
featureFlags =
FeatureFlags $
HashMap.fromList
[ ("test-flag", testFlag),
("native-query-interface", logicalModelInterface)
]
--------------------------------------------------------------------------------
testFlag :: FeatureFlag
testFlag =
FeatureFlag
{ ffIdentifier = Identifier "test-flag",
ffDefaultValue = False,
ffDescription = "Testing feature flag integration",
ffEnvVar = "HASURA_FF_TEST_FLAG"
}
logicalModelInterface :: FeatureFlag
logicalModelInterface =
FeatureFlag
{ ffIdentifier = Identifier "native-query-interface",
ffDefaultValue = False,
ffDescription = "Expose custom views, permissions and advanced SQL functionality via custom queries",
ffEnvVar = "HASURA_FF_LOGICAL_MODEL_INTERFACE"
}