module Web.Apiary.Session
( Session
, getSession, setSession, deleteSession
, session, session'
, Proxy(Proxy)
) where
import Control.Monad(mzero)
import Control.Monad.Apiary.Action(ActionT)
import Control.Monad.Apiary.Filter(focus, Filter, Doc(DocPrecondition))
import Web.Apiary.Session.Internal
(Session(Session), backendGet, backendSet, backendDelete)
import Data.Apiary.Extension(Has, getExt)
import Data.Proxy(Proxy(..))
import GHC.TypeLits(KnownSymbol)
import qualified Data.Apiary.Routing.Dict as Dict
import qualified Data.Apiary.Routing as R
getSession :: (Has (Session sess m) exts, Monad m) => proxy sess -> ActionT exts prms m (Maybe sess)
getSession _ = do
Session b <- getExt Proxy
backendGet b
setSession :: (Has (Session sess m) exts, Monad m) => proxy sess -> sess -> ActionT exts prms m ()
setSession _ v = do
Session b <- getExt Proxy
backendSet b v
deleteSession :: forall proxy exts prms m sess. (Has (Session sess m) exts, Monad m)
=> proxy sess -> ActionT exts prms m ()
deleteSession _ = do
Session b <- getExt (Proxy :: Proxy (Session sess m))
backendDelete b
session' :: (Has (Session sess actM) exts, KnownSymbol key, Monad actM, key Dict.</ kvs)
=> kProxy key -> sProxy sess
-> Filter exts actM m kvs (key Dict.:= sess ': kvs)
session' ky p = focus (DocPrecondition "session cookie required.") Nothing $ R.raw "session" $ \d t ->
getSession p >>= \case
Nothing -> mzero
Just s -> return (Dict.add ky s d, t)
session :: (Has (Session sess actM) exts, Monad actM, "session" Dict.</ kvs)
=> proxy sess
-> Filter exts actM m kvs ("session" Dict.:= sess ': kvs)
session = session' (Proxy :: Proxy "session")