HELPS/src/Database.hs
2024-10-12 18:08:29 -05:00

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)