packages feed

snaplet-customauth-0.3.0: Snap/Snaplet/CustomAuth/OAuth2/Splices.hs

{-# LANGUAGE OverloadedStrings #-}

module Snap.Snaplet.CustomAuth.OAuth2.Splices (addOAuth2Splices) where

import Control.Lens
import Control.Monad.Trans
import Control.Monad.State
import Data.Map.Syntax
import Data.Maybe
import Heist
import Heist.Compiled
import Snap
import Snap.Snaplet.Heist
import Snap.Snaplet.Session

import Snap.Snaplet.CustomAuth.AuthManager
import Snap.Snaplet.CustomAuth.Util

addOAuth2Splices
  :: Snaplet (Heist b)
  -> SnapletLens b (AuthManager u e b)
  -> Initializer b v ()
addOAuth2Splices h auth = addConfig h sc
  where
    sc = mempty & scCompiledSplices .~ cs
    cs = do
      "ifHaveOAuth2Token" ## spliceOAuth2Token True auth
      "ifNoOAuth2Token" ## spliceOAuth2Token False auth

spliceOAuth2Token
  :: Bool
  -> SnapletLens b (AuthManager u e b)
  -> SnapletCSplice b
spliceOAuth2Token t auth = do
  cs <- runChildren
  return $ yieldRuntime $ do
    name <- lift $ (<> "_token") <$> withTop auth getStateName
    store <- lift $ withTop auth $ gets stateStore'
    chk <- lift $ withTop' store $ (fmap isJust $ getFromSession name)
    if chk == t then codeGen cs else mempty