import Control.Monad.Logger (runLoggingT, LoggingT, defaultLogStr) import Database.Persist.Sqlite (runSqlPool) import Data.Text (append) import System.Log.FastLogger (newStderrLoggerSet, defaultBufSize, pushLogStr) import Import import qualified Database.Esqueleto as E runQueries :: UTCTime -> NominalDiffTime -> SqlPersistT (ResourceT (LoggingT IO)) () runQueries now expiration = do $(logInfo) "Delete expired shopping carts." carts <- E.select $ E.from $ \(c, u) -> do E.where_ ( c E.^. CartUpdated E.<. E.val (addUTCTime (- expiration) now) E.&&. c E.^. CartCustomer E.==. u E.^. UserId ) return (c, u) forM_ carts $ \(cart, user) -> do cartitems <- selectList [ CartItemCart ==. entityKey cart ] [] forM_ cartitems $ \ci -> do update (cartItemItem $ entityVal ci) [ItemStock +=. cartItemQuantity (entityVal ci)] delete $ entityKey ci delete $ entityKey cart $(logInfo) $ "Deleted cart: " `append` userEmail (entityVal user) main :: IO () main = do -- Get the settings from all relevant sources settings <- loadAppSettingsArgs -- fall back to compile-time values, set to [] to require values at runtime [configSettingsYmlValue] -- allow environment variables to override useEnv now <- getCurrentTime pool <- createPoolConfig (appDatabaseConf settings) loggerSet <- newStderrLoggerSet defaultBufSize let logFunc loc src level str = pushLogStr loggerSet (defaultLogStr loc src level str) flip runLoggingT logFunc $ runResourceT $ runSqlPool (runQueries now $ appCartExpiration settings) pool