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)