module Yesod.Session.Freeze
  ( disableSessionManagement
  , assignSessionFreeze
  ) where

import Internal.Prelude

import Embedding
import Session.Freeze
import Yesod.Core (HandlerSite, MonadHandler (liftHandler), getYesod)
import Yesod.Session.Embedding.Options

-- | Indicate whether the session should be frozen for the handling
--   of the current request
--
-- At the end of the request handler, if the value is 'Just', no
-- database actions will be performed and no cookies will be set.
assignSessionFreeze
  :: (MonadHandler m, HasSessionEmbeddings (HandlerSite m))
  => Maybe SessionFreeze
  -- ^ 'Just' to freeze the session, or 'Nothing' to cancel any previous
  --   request for session freezing and restore the default behavior
  -> m ()
assignSessionFreeze :: forall (m :: * -> *).
(MonadHandler m, HasSessionEmbeddings (HandlerSite m)) =>
Maybe SessionFreeze -> m ()
assignSessionFreeze Maybe SessionFreeze
f = do
  SessionEmbeddings
embedding <- HandlerSite m -> SessionEmbeddings
forall a. HasSessionEmbeddings a => a -> SessionEmbeddings
getSessionEmbeddings (HandlerSite m -> SessionEmbeddings)
-> m (HandlerSite m) -> m SessionEmbeddings
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (HandlerSite m)
forall (m :: * -> *). MonadHandler m => m (HandlerSite m)
getYesod
  HandlerFor (HandlerSite m) () -> m ()
forall a. HandlerFor (HandlerSite m) a -> m a
forall (m :: * -> *) a.
MonadHandler m =>
HandlerFor (HandlerSite m) a -> m a
liftHandler (HandlerFor (HandlerSite m) () -> m ())
-> HandlerFor (HandlerSite m) () -> m ()
forall a b. (a -> b) -> a -> b
$ Embedding (MapOperations Text ByteString) () SessionFreeze
-> Maybe SessionFreeze -> HandlerFor (HandlerSite m) ()
forall (con :: (* -> *) -> Constraint) (m :: * -> *) e a.
con m =>
Embedding con e a -> Maybe a -> m ()
embed SessionEmbeddings
embedding.freeze Maybe SessionFreeze
f

disableSessionManagement
  :: (MonadHandler m, HasSessionEmbeddings (HandlerSite m)) => m ()
disableSessionManagement :: forall (m :: * -> *).
(MonadHandler m, HasSessionEmbeddings (HandlerSite m)) =>
m ()
disableSessionManagement = Maybe SessionFreeze -> m ()
forall (m :: * -> *).
(MonadHandler m, HasSessionEmbeddings (HandlerSite m)) =>
Maybe SessionFreeze -> m ()
assignSessionFreeze (SessionFreeze -> Maybe SessionFreeze
forall a. a -> Maybe a
Just SessionFreeze
FreezeSessionForCurrentRequest)