mirror of
https://github.com/zhigang1992/graphql-engine.git
synced 2026-05-22 15:35:20 +08:00
server: try environment variables if flags are missing, closes #45
This commit is contained in:
committed by
Vamshi Surabhi
parent
1998e211af
commit
e834bc51a6
@@ -7,6 +7,7 @@ import Ops
|
||||
|
||||
import Data.Time.Clock (getCurrentTime)
|
||||
import Options.Applicative
|
||||
import System.Environment (lookupEnv)
|
||||
import System.Exit (exitFailure)
|
||||
import Web.Spock.Core (runSpockNoBanner, spockT)
|
||||
|
||||
@@ -38,7 +39,7 @@ data ServeOptions
|
||||
, soTxIso :: !Q.TxIsolation
|
||||
, soRootDir :: !(Maybe String)
|
||||
, soAccessKey :: !(Maybe AccessKey)
|
||||
, soCorsConfig :: !CorsConfig
|
||||
, soCorsConfig :: !CorsConfigFlags
|
||||
, soWebHook :: !(Maybe T.Text)
|
||||
, soEnableConsole :: !Bool
|
||||
} deriving (Show, Eq)
|
||||
@@ -93,25 +94,32 @@ mkAuthMode mAccessKey mWebHook =
|
||||
(Nothing, Nothing) -> return AMNoAuth
|
||||
(Just key, Nothing) -> return $ AMAccessKey key
|
||||
(Nothing, Just _) -> throwError $
|
||||
"Fatal Error : --auth-hook requires --access-key to be set"
|
||||
"Fatal Error : --auth-hook (HASURA_GRAPHQL_AUTH_HOOK)"
|
||||
++ " requires --access-key (HASURA_GRAPHQL_ACCESS_KEY) to be set"
|
||||
(Just key, Just hook) -> return $ AMAccessKeyAndHook key hook
|
||||
|
||||
main :: IO ()
|
||||
main = withStdoutLogger ravenLogGen $ \rlogger -> do
|
||||
(RavenOptions rci ravenMode) <- parseArgs
|
||||
ci <- either ((>> exitFailure) . (putStrLn . connInfoErrModifier))
|
||||
return $ mkConnInfo rci
|
||||
mEnvDbUrl <- lookupEnv "HASURA_GRAPHQL_DATABASE_URL"
|
||||
ci <- either ((>> exitFailure) . putStrLn . connInfoErrModifier)
|
||||
return $ mkConnInfo mEnvDbUrl rci
|
||||
printConnInfo ci
|
||||
case ravenMode of
|
||||
ROServe (ServeOptions port cp isoL mRootDir mAccessKey corsCfg mWebHook enableConsole) -> do
|
||||
mFinalAccessKey <- considerEnv "HASURA_GRAPHQL_ACCESS_KEY" mAccessKey
|
||||
mFinalWebHook <- considerEnv "HASURA_GRAPHQL_AUTH_HOOK" mWebHook
|
||||
am <- either ((>> exitFailure) . putStrLn) return $
|
||||
mkAuthMode mAccessKey mWebHook
|
||||
mkAuthMode mFinalAccessKey mFinalWebHook
|
||||
finalCorsDomain <- fromMaybe "*" <$> considerEnv "HASURA_GRAPHQL_CORS_DOMAIN" (ccDomain corsCfg)
|
||||
let finalCorsCfg =
|
||||
CorsConfigG finalCorsDomain $ ccDisabled corsCfg
|
||||
initialise ci
|
||||
migrate ci
|
||||
pool <- Q.initPGPool ci cp
|
||||
runSpockNoBanner port $ do
|
||||
putStrLn $ "server: running on port " ++ show port
|
||||
spockT id $ app isoL mRootDir rlogger pool am corsCfg enableConsole
|
||||
spockT id $ app isoL mRootDir rlogger pool am finalCorsCfg enableConsole
|
||||
ROExport -> do
|
||||
res <- runTx ci fetchMetadata
|
||||
either ((>> exitFailure) . printJSON) printJSON res
|
||||
@@ -147,3 +155,7 @@ main = withStdoutLogger ravenLogGen $ \rlogger -> do
|
||||
++ "\n Port: " ++ show (Q.connPort ci)
|
||||
++ "\n User: " ++ Q.connUser ci
|
||||
++ "\n Database: " ++ Q.connDatabase ci
|
||||
|
||||
-- if flags given are Nothing consider it's value from Env
|
||||
considerEnv _ (Just t) = return $ Just t
|
||||
considerEnv e Nothing = fmap T.pack <$> lookupEnv e
|
||||
|
||||
@@ -75,9 +75,10 @@ parseRawConnInfo =
|
||||
connInfoErrModifier :: String -> String
|
||||
connInfoErrModifier s = "Fatal Error : " ++ s
|
||||
|
||||
mkConnInfo :: RawConnInfo -> Either String Q.ConnInfo
|
||||
mkConnInfo (RawConnInfo mHost mPort mUser pass mURL mDB opts) =
|
||||
case (mHost, mPort, mUser, mDB, mURL) of
|
||||
mkConnInfo :: Maybe String -> RawConnInfo -> Either String Q.ConnInfo
|
||||
mkConnInfo mEnvDbUrl (RawConnInfo mHost mPort mUser pass mURL mDB opts) = do
|
||||
let mFinalDBUrl = ifNothingTakeEnv mURL
|
||||
case (mHost, mPort, mUser, mDB, mFinalDBUrl) of
|
||||
|
||||
(Just host, Just port, Just user, Just db, Nothing) ->
|
||||
return $ Q.ConnInfo host port user pass db opts
|
||||
@@ -87,10 +88,12 @@ mkConnInfo (RawConnInfo mHost mPort mUser pass mURL mDB opts) =
|
||||
_ -> throwError $ "Invalid options. "
|
||||
++ "Expecting all database connection params "
|
||||
++ "(host, port, user, dbname, password) or "
|
||||
++ "database-url"
|
||||
++ "database-url (HASURA_GRAPHQL_DATABASE_URL)"
|
||||
where
|
||||
invalidUrlMsg = "Invalid database-url. "
|
||||
invalidUrlMsg = "Invalid database-url (HASURA_GRAPHQL_DATABASE_URL). "
|
||||
++ "Example postgres://foo:bar@example.com:2345/database"
|
||||
ifNothingTakeEnv Nothing = mEnvDbUrl
|
||||
ifNothingTakeEnv t = t
|
||||
|
||||
readIsoLevel :: String -> Either String Q.TxIsolation
|
||||
readIsoLevel isoS =
|
||||
@@ -147,21 +150,22 @@ parseAccessKey = optional $ strOption ( long "access-key" <>
|
||||
help "Secret access key, required to access this instance"
|
||||
)
|
||||
|
||||
data CorsConfig
|
||||
= CorsConfig
|
||||
{ ccDomain :: !T.Text
|
||||
data CorsConfigG a
|
||||
= CorsConfigG
|
||||
{ ccDomain :: !a
|
||||
, ccDisabled :: !Bool
|
||||
} deriving (Show, Eq)
|
||||
|
||||
parseCorsConfig :: Parser CorsConfig
|
||||
type CorsConfigFlags = CorsConfigG (Maybe T.Text)
|
||||
type CorsConfig = CorsConfigG T.Text
|
||||
|
||||
parseCorsConfig :: Parser CorsConfigFlags
|
||||
parseCorsConfig =
|
||||
CorsConfig
|
||||
<$> strOption ( long "cors-domain" <>
|
||||
CorsConfigG
|
||||
<$> optional (strOption ( long "cors-domain" <>
|
||||
metavar "CORS DOMAIN" <>
|
||||
value "*" <>
|
||||
showDefault <>
|
||||
help "The domain, including scheme and port, to allow CORS for"
|
||||
)
|
||||
))
|
||||
<*> switch ( long "disable-cors" <>
|
||||
help "Disable CORS handling"
|
||||
)
|
||||
|
||||
@@ -234,7 +234,7 @@ raven_app :: RavenLogger -> PGQ.PGPool -> IO Application
|
||||
raven_app rlogger pool =
|
||||
do
|
||||
_ <- liftIO $ runExceptT $ Q.runTx pool defTxMode resetStateTx
|
||||
let corsCfg = CorsConfig "*" True -- cors is disabled
|
||||
let corsCfg = CorsConfigG "*" True -- cors is disabled
|
||||
spockAsApp $ spockT id $ app Q.Serializable Nothing rlogger pool AMNoAuth corsCfg True -- no access key and no webhook
|
||||
|
||||
main :: IO ()
|
||||
@@ -242,7 +242,7 @@ main = withStdoutLogger ravenLogGen $ \rlogger -> do
|
||||
Options rci cp args <- parseArgs
|
||||
|
||||
ci <- either ((>> exitFailure) . (putStrLn . connInfoErrModifier))
|
||||
return $ mkConnInfo rci
|
||||
return $ mkConnInfo Nothing rci
|
||||
|
||||
pool <- Q.initPGPool ci cp
|
||||
|
||||
|
||||
Reference in New Issue
Block a user