51 lines
1.9 KiB
Haskell
51 lines
1.9 KiB
Haskell
module Database where
|
|
|
|
import Core
|
|
|
|
import Control.Exception (IOException)
|
|
import Data.Aeson (ToJSON)
|
|
import Data.Maybe (listToMaybe)
|
|
import Database.PostgreSQL.Simple
|
|
import Effectful
|
|
import Effectful.Dispatch.Dynamic
|
|
import Effectful.Error.Static (Error)
|
|
import Servant hiding ((:>), throwError)
|
|
|
|
runDatabaseDebug :: DatabaseEffects es => Eff (Database : es) a -> Eff es a
|
|
runDatabaseDebug = interpret $ \_ -> \case
|
|
DatabaseRead (statement, values) -> read statement values
|
|
DatabaseWrite (statement, values) -> write statement values
|
|
where
|
|
read _ values =
|
|
writeLog "Mocked a READ database operation" >>= \_ -> pure $
|
|
Just (User values "Mock User")
|
|
write _ values =
|
|
writeLog $ "Mocked a WRITE database operation with a user named "
|
|
++ values
|
|
|
|
runDatabaseIO :: DatabaseEffects es => Eff (Database : es) a -> Eff es a
|
|
runDatabaseIO = interpret $ \_ -> \case
|
|
DatabaseRead (statement, values) -> read statement values
|
|
DatabaseWrite (statement, values) -> write statement values
|
|
where
|
|
read :: DatabaseEffects es => Query -> Int -> Eff es (Maybe User)
|
|
read statement values = do
|
|
conn <- adapt $ openConn
|
|
users <- adapt $ query conn statement (Only values)
|
|
pure $ listToMaybe users
|
|
|
|
write :: DatabaseEffects es => Query -> String -> Eff es ()
|
|
write statement values = do
|
|
conn <- adapt openConn
|
|
adapt $ execute conn statement (Only values)
|
|
writeLog $ "Wrote user to database using statement:\n" ++ show statement
|
|
|
|
openConn :: IO Connection
|
|
openConn = connectPostgreSQL "host=localhost port=5432 dbname=demo connect_timeout=10"
|
|
|
|
queryUser :: Int -> (Query, Int)
|
|
queryUser userId = ("SELECT id, name FROM users WHERE id = ?;", userId)
|
|
|
|
writeUser :: String -> (Query, String)
|
|
writeUser name = ("INSERT INTO users (name) VALUES (?);", name)
|