module Servant.Server.Auth.Token.Monad(
AuthHandler(..)
, require
, getConfig
, getsConfig
, runDB404
, module Reexport
) where
import Control.Monad.Except (ExceptT, MonadError)
import Control.Monad.Reader (MonadIO, MonadReader, ReaderT, ask, asks)
import Data.Monoid ((<>))
import Database.Persist.Postgresql
import Servant
import qualified Data.ByteString.Lazy as BS
import Servant.Server.Auth.Token.Config
import Servant.Server.Auth.Token.Model
import Servant.Server.Auth.Token.Error as Reexport
newtype AuthHandler a = AuthHandler {
runAuthHandler :: ReaderT AuthConfig (ExceptT ServantErr IO) a
} deriving ( Functor, Applicative, Monad, MonadReader AuthConfig,
MonadError ServantErr, MonadIO)
require :: BS.ByteString -> Maybe a -> AuthHandler a
require info Nothing = throw400 $ info <> " is required"
require _ (Just a) = return a
getConfig :: AuthHandler AuthConfig
getConfig = ask
getsConfig :: (AuthConfig -> a) -> AuthHandler a
getsConfig = asks
runDB404 :: BS.ByteString -> SqlPersistT IO (Maybe a) -> AuthHandler a
runDB404 info ma = do
a <- runDB ma
case a of
Nothing -> throw404 $ "Cannot find " <> info
Just a' -> return a'