{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} import Control.Monad.IO.Class import Control.Monad.Logger import Control.Monad.Trans.Resource import Data.Conduit import qualified Data.Conduit.List as CL import Data.Maybe import qualified Data.Text as T import qualified Data.Text.IO as T import Data.Time import Database.Persist.MySQL (ConnectInfo (..), defaultConnectInfo, withMySQLPool) import Database.Persist.Relational import Database.Persist.Sql import Database.Relational (relationalQuery) import System.Environment import Model import Query import Types addUser :: (MonadUnliftIO m, MonadLogger m) => User -> [UserGroupId] -> SqlPersistT m UserId addUser user userGroupIds = do userId <- insert user insertMany_ $ map (Membership userId) userGroupIds return userId sample :: (MonadUnliftIO m, MonadLogger m) => SqlPersistT m () sample = do runMigration migrateAll now <- liftIO getCurrentTime userGroupPersistentId <- insert $ UserGroup "persistent" Nothing userGroupHrrId <- insert $ UserGroup "haskell-relational-record" Nothing userGroupHaskellJpId <- insert $ UserGroup "haskell-jp" (Just "https://haskell.jp/") _ <- addUser (User "michael@example.com" "Michael" UserActive now now) [userGroupPersistentId] _ <- addUser (User "khibino@example.com" "Kei" UserActive now now) [userGroupHrrId, userGroupHaskellJpId] _ <- addUser (User "thimura@example.com" "Takahiro" UserSuspended now now) [userGroupPersistentId, userGroupHrrId, userGroupHaskellJpId] liftIO $ putStrLn "## haskell-jp users:" runResourceT . runConduit $ runQuery (relationalQuery $ selectUserByUserGroupNameList False ["haskell-jp"]) () .| CL.mapM_ (liftIO . printUser) liftIO $ putStrLn "## persistent users:" runResourceT . runConduit $ runQuery (relationalQuery $ selectUserByUserGroupNameList False ["persistent"]) () .| CL.mapM_ (liftIO . printUser) liftIO $ putStrLn "## both persistent and haskell-relational-record users:" runResourceT . runConduit $ runQuery (relationalQuery $ selectUserByUserGroupNameList False ["persistent", "haskell-relational-record"]) () .| CL.mapM_ (liftIO . printUser) printUser :: Entity User -> IO () printUser (Entity k (User {..})) = T.putStrLn $ T.concat [ T.pack (show userId), ": ", userName, " <", userEmail, ">" ] where userId = fromSqlKey k getConnectInfo :: IO ConnectInfo getConnectInfo = do host <- fromMaybe "localhost" `fmap` lookupEnv "MYSQL_HOST" user <- fromMaybe "travis" `fmap` lookupEnv "MYSQL_USER" pass <- fromMaybe "" `fmap`lookupEnv "MYSQL_PASS" return defaultConnectInfo { connectHost = host , connectUser = user , connectPassword = pass , connectDatabase = "test" } main :: IO () main = do connInfo <- getConnectInfo runLoggingT $ withMySQLPool connInfo 10 $ runSqlPool sample where -- runLoggingT = runNoLoggingT runLoggingT = runStderrLoggingT