module JRState where
import Database.Persist.Sql (ConnectionPool)
import Authorisation (UserId)
import Data.Text (Text)
import UserDeck (UserDeckCpt)
import Data.Map (Map)
import Control.Concurrent.STM (TVar)
import Control.Concurrent.STM.TVar (readTVarIO)
import Control.Monad.Logger (LoggingT, LogLevel)
import Control.Monad.IO.Class (MonadIO)
import LogFilter (runFilteredLoggingT)
import ConnectionSpec (DataDescriptor, PostgresConnection)
import LearningData (DataSourceId)
import Database.HDBC.PostgreSQL (Connection)
type PostgresConnPool = Map PostgresConnection (Int, Connection)
type DataSchemes = Map DataSourceId DataDescriptor
type UserConfig = Map Text (UserId, [UserDeckCpt])
data JRState = JRState {
logLevel :: LogLevel,
tablesFile :: ConnectionPool,
secureOnly :: Bool,
shuffleCards :: Bool,
sessionTimeout :: Int,
portNumber :: Maybe Int,
keysFile :: FilePath,
databaseUser :: Text,
appRoot :: Text,
postgresConnections :: TVar PostgresConnPool,
dataSchemes :: TVar DataSchemes,
userConfig :: TVar UserConfig
}
runFilteredLoggingT :: MonadIO m => JRState -> LoggingT m a -> m a
runFilteredLoggingT site = LogFilter.runFilteredLoggingT (logLevel site)
getPostgresConnPool :: JRState -> IO PostgresConnPool
getPostgresConnPool = readTVarIO . postgresConnections
getDataSchemes :: JRState -> IO DataSchemes
getDataSchemes = readTVarIO . dataSchemes
getUserConfig :: JRState -> IO UserConfig
getUserConfig = readTVarIO . userConfig