{-# LANGUAGE FlexibleContexts #-}

{- | Make running Persistent based database transactions easy in Scottish apps.
-}
module Web.Scottish.Database.Persist where

import Control.Exception.Enclosed
import Control.Monad.IO.Class
import Control.Monad.Trans.Class

import Data.Functor

import Database.Persist.Sql

import Network.HTTP.Types.Status

import Web.Scottish
import Web.Scottish.Database

runSql :: (MonadTrans t, HasDatabaseConnectionPool Connection config)
       => SqlPersistM a -> t (Scottish config s s') a
runSql s = liftIO . runSqlPersistMPool s >$< getPool

-- | Catches any synchronous exceptions thrown when executing the database
-- transaction, and 'raise' an 'internalServerError500' instead.
runSql' :: (HasDatabaseConnectionPool Connection config)
        => SqlPersistM a -> ScottishActionM' config s' a
runSql' s = (runSql $ (Just <$> s) `catchAny` \_ -> return Nothing)
            >>= maybe (raise internalServerError500) return