chakra-0.1.0: examples/Main.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Main (main) where
import RIO
import Chakra
import Servant
import Configuration.Dotenv (defaultConfig, loadFile)
import qualified Data.Text as T
import Options.Applicative.Simple
import qualified Paths_chakra
import Servant.Auth.Server as SAS
import qualified User as U
type API auths = (SAS.Auth auths AuthenticatedUser :> U.UserAPI) :<|> EmptyAPI
appAPI :: Proxy (API '[SAS.JWT])
appAPI = Proxy
main :: IO ()
main = do
hSetBuffering stdin LineBuffering
_ <- loadFile defaultConfig -- load .env file if available
-- Load the AppSettings data from ENV variables
withAppSettingsFromEnv $ \appSettings -> do
-- Override the version from cabal file
let ver = $(simpleVersion Paths_chakra.version) -- TH to get cabal project's git sha version
infoDetail = appSettings {appVersion = T.pack ver}
logFunc <- buildLogger (appEnvironment infoDetail) (appVersion infoDetail)
userRepo <- U.newInMemRepo
middlewares <- chakraMiddlewares infoDetail
jwtCfg <- getJWTAuthSettings
let cookieCfg = defaultCookieSettings {cookieIsSecure = SAS.NotSecure}
sctx = cookieCfg :. jwtCfg :. chakraErrorFormatters :. EmptyContext
appServer = U.server :<|> emptyServer
-- Run API server with JWT auth and in-mem user repo
runChakraAppWithMetrics
middlewares
sctx
(logFunc, infoDetail, userRepo)
appAPI
appServer