jitsi-roomsv2/backend/src/WebServer.hs

127 lines
2.6 KiB
Haskell
Raw Normal View History

2023-01-27 18:34:28 +01:00
{-# LANGUAGE AllowAmbiguousTypes #-}
2023-01-27 19:53:34 +01:00
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
2023-01-27 18:34:28 +01:00
2023-01-15 18:26:41 +01:00
module WebServer (runWebServer) where
2023-01-27 19:53:34 +01:00
import ClassyPrelude hiding (decodeUtf8)
2023-01-29 12:08:50 +01:00
import Control.Monad.Except
2023-01-27 19:53:34 +01:00
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp (run)
import RoomDataHandler (roomDataHandler)
2023-01-27 19:53:34 +01:00
import Types.AppTypes
( Env (..),
HasConnectedClientState (..),
)
import Types.RoomsState
( HasRoomsState (getRoomsState),
roomStateDiffers,
updateRoomState,
)
import Types.WebEnv
2023-01-27 18:34:28 +01:00
2023-01-29 12:08:50 +01:00
newtype ExceptTApp e a = E {unExceptTApp :: IO (Either e a)}
deriving
( Functor,
Applicative,
Monad,
MonadIO,
MonadError e
)
via ExceptT e IO
newtype WebApp env a = WebApp {unWebApp :: env -> IO (Either ResponseReceived a)}
2023-01-27 18:34:28 +01:00
deriving
( Functor,
Applicative,
Monad,
MonadReader env,
2023-01-29 12:08:50 +01:00
MonadIO,
MonadError ResponseReceived
2023-01-27 18:34:28 +01:00
)
2023-01-29 12:08:50 +01:00
via ReaderT env (ExceptTApp ResponseReceived)
getRequestPath ::
2023-01-27 18:34:28 +01:00
( MonadIO m,
HasWebEnv env,
MonadReader env m
) =>
m [Text]
getRequestPath = do
2023-01-27 18:34:28 +01:00
request <- getRequest <$> ask
return $ pathInfo request
2023-01-27 18:34:28 +01:00
app ::
( MonadIO m,
HasWebEnv env,
HasConnectedClientState env,
2023-01-27 19:53:34 +01:00
MonadReader env m,
2023-01-29 12:08:50 +01:00
HasRoomsState env,
MonadError ResponseReceived m
2023-01-27 18:34:28 +01:00
) =>
m ResponseReceived
app = requestPathHandler
requestPathHandler ::
( MonadIO m,
HasWebEnv env,
HasConnectedClientState env,
MonadReader env m,
2023-01-29 12:08:50 +01:00
HasRoomsState env,
MonadError ResponseReceived m
) =>
m ResponseReceived
requestPathHandler = do
getRequestPath >>= \case
["roomdata"] -> roomDataHandler
_ -> notFound
notFound ::
( MonadIO m,
HasWebEnv env,
2023-01-29 12:08:50 +01:00
MonadReader env m,
MonadError ResponseReceived m
) =>
m ResponseReceived
notFound = do
respond' <- getRespond <$> ask
2023-01-29 12:08:50 +01:00
response <-
liftIO $
respond' $
responseLBS
status404
[("Content-Type", "text/plain")]
"404 - Not Found"
throwError response
2023-01-27 18:34:28 +01:00
runWebApp ::
( MonadIO m,
MonadReader Env m
) =>
m Application
runWebApp = do
env <- ask
return
( \req res -> do
let webEnv = WebEnv {appEnv = env, request = req, respond = res}
2023-01-29 12:08:50 +01:00
eitherResult <- unWebApp app webEnv
case eitherResult of
Left result -> do
liftIO $ putStrLn "Some error occured"
return result
Right result -> do
return result
2023-01-27 18:34:28 +01:00
)
runWebServer ::
( MonadIO m,
MonadReader Env m
) =>
m ()
runWebServer = do
putStrLn "http://localhost:8081/"
runWebApp >>= liftIO . run 8081
return ()