2024-09-18 13:16:36 -05:00
|
|
|
module Main (main) where
|
|
|
|
|
|
|
|
import Core
|
|
|
|
import Database
|
|
|
|
import Handlers
|
2024-10-13 13:30:39 -05:00
|
|
|
import Logger
|
|
|
|
import Routes
|
2024-09-18 13:16:36 -05:00
|
|
|
|
2024-10-21 17:26:25 -05:00
|
|
|
import Control.Monad.Except (ExceptT (ExceptT))
|
2024-09-18 13:16:36 -05:00
|
|
|
import Data.List
|
|
|
|
import Effectful
|
2024-10-21 17:26:25 -05:00
|
|
|
import Effectful.Error.Static (Error, runErrorNoCallStack, throwError)
|
2024-10-13 10:40:51 -05:00
|
|
|
import Effectful.Reader.Static
|
2024-10-21 17:26:25 -05:00
|
|
|
import Network.Wai.Handler.Warp (run)
|
|
|
|
import Network.Wai.Middleware.Static ((>->), staticPolicy, noDots, addBase)
|
2024-10-22 17:44:16 -05:00
|
|
|
import Servant hiding ((:>), throwError, inject)
|
2024-10-21 17:26:25 -05:00
|
|
|
import qualified Servant as S
|
2024-11-05 15:18:21 -06:00
|
|
|
import System.Environment (lookupEnv)
|
|
|
|
|
|
|
|
--
|
|
|
|
-- Types
|
|
|
|
--
|
|
|
|
|
|
|
|
data RunMode = Production | Debug
|
|
|
|
|
|
|
|
proxy :: Proxy AppAPI
|
|
|
|
proxy = Proxy
|
2024-09-18 13:16:36 -05:00
|
|
|
|
2024-10-12 17:38:22 -05:00
|
|
|
--
|
|
|
|
-- Application
|
|
|
|
--
|
2024-09-18 13:16:36 -05:00
|
|
|
main :: IO ()
|
2024-10-13 10:40:51 -05:00
|
|
|
main = do
|
2024-11-05 15:18:21 -06:00
|
|
|
(envPort, envMode) <- do
|
|
|
|
port <- lookupEnv "PORT"
|
|
|
|
env <- lookupEnv "ENVIRONMENT"
|
|
|
|
pure (port, env)
|
|
|
|
|
|
|
|
let port = maybe 8080 read envPort
|
|
|
|
mode = case envMode of
|
|
|
|
Just "production" -> Production
|
|
|
|
_ -> Debug
|
2024-09-18 13:16:36 -05:00
|
|
|
|
2024-11-05 15:18:21 -06:00
|
|
|
env <- case mode of
|
|
|
|
Production -> do
|
|
|
|
dbPool <- createConnectionPool "host=localhost dbname=demo"
|
|
|
|
let env = AppEnv { pool = Just dbPool }
|
|
|
|
appEff env databaseInit
|
|
|
|
pure env
|
|
|
|
Debug -> do
|
|
|
|
let env = AppEnv { pool = Nothing }
|
|
|
|
appDebug env databaseInit
|
|
|
|
pure env
|
|
|
|
|
|
|
|
run port . middleware . serve proxy $ app env mode
|
|
|
|
|
|
|
|
app :: AppEnv -> RunMode -> Server AppAPI
|
|
|
|
app env Production = hoistServer proxy (Handler . ExceptT . appEff env) handlers
|
|
|
|
app env Debug = hoistServer proxy (Handler . ExceptT . appDebug env) handlers
|
2024-10-14 13:05:17 -05:00
|
|
|
|
|
|
|
handlers :: ServerT AppAPI AppEff
|
|
|
|
handlers = rootHandler
|
|
|
|
:<|> userListHandler
|
|
|
|
:<|> userGetHandler
|
|
|
|
:<|> userPostHandler
|
|
|
|
:<|> userDeleteHandler
|
|
|
|
|
2024-10-21 17:26:25 -05:00
|
|
|
middleware :: Application -> Application
|
|
|
|
middleware = staticPolicy (noDots >-> addBase "data/assets/public")
|
|
|
|
|
2024-11-05 15:18:21 -06:00
|
|
|
--
|
|
|
|
-- Effect Stacks
|
|
|
|
--
|
|
|
|
|
|
|
|
appEff :: AppEnv -> AppEff a -> IO (Either ServerError a)
|
|
|
|
appEff env = runEff
|
2024-10-14 13:05:17 -05:00
|
|
|
. runErrorNoCallStack
|
|
|
|
. runReader env
|
|
|
|
. runDatabaseIO
|
|
|
|
. runLoggerPSQL
|
2024-10-22 17:44:16 -05:00
|
|
|
. inject
|
2024-09-18 13:16:36 -05:00
|
|
|
|
2024-11-05 15:18:21 -06:00
|
|
|
appDebug :: AppEnv -> AppEff a -> IO (Either ServerError a)
|
|
|
|
appDebug env = runEff
|
|
|
|
. runErrorNoCallStack
|
|
|
|
. runReader env
|
|
|
|
. runDatabaseDebug
|
|
|
|
. runLoggerConsole
|
|
|
|
. inject
|