module Web.Spock
(
spock, SpockM, SpockAction
, PoolOrConn (..), ConnBuilder (..), PoolCfg (..)
, HasSpock (runQuery, getState)
, SessionCfg (..)
, readSession, writeSession, modifySession
, setCookie, setCookie', getCookie
, SafeAction (..)
, safeActionPath
, get, post, put, delete, patch, addroute, Http.StdMethod (..)
, middleware, matchAny, notFound
, request, reqHeader, body, param, params, jsonData, files
, status, addHeader, setHeader, redirect
, text, html, file, json, source, raw
, raise, rescue, next
, RoutePattern
, paramPathPiece
, getSpockHeart, runSpockIO, WebStateM, WebState
)
where
import Web.Spock.SessionManager
import Web.Spock.Monad
import Web.Spock.Types
import Web.Spock.Cookie
import Web.Spock.SafeActions
import Control.Applicative
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Resource
import Data.Pool
import Web.Scotty.Trans
import Web.PathPieces
import qualified Network.HTTP.Types as Http
import qualified Data.Text.Lazy as TL
spock :: Int -> SessionCfg sess -> PoolOrConn conn -> st -> SpockM conn sess st () -> IO ()
spock port sessionCfg poolOrConn initialState defs =
do sessionMgr <- createSessionManager sessionCfg
connectionPool <-
case poolOrConn of
PCConduitPool p ->
return (ConduitPool p)
PCPool p ->
return (DataPool p)
PCConn cb ->
let pc = cb_poolConfiguration cb
in DataPool <$> createPool (cb_createConn cb) (cb_destroyConn cb)
(pc_stripes pc) (pc_keepOpenTime pc)
(pc_resPerStripe pc)
let internalState =
WebState
{ web_dbConn = connectionPool
, web_sessionMgr = sessionMgr
, web_state = initialState
}
runM m = runResourceT $ runReaderT (runWebStateM m) internalState
runActionToIO = runM
scottyT port runM runActionToIO $
do middleware (sm_middleware sessionMgr)
hookSafeActions
defs
writeSession :: sess -> SpockAction conn sess st ()
writeSession d =
do mgr <- getSessMgr
(sm_writeSession mgr) d
modifySession :: (sess -> sess) -> SpockAction conn sess st ()
modifySession f =
do mgr <- getSessMgr
(sm_modifySession mgr) f
readSession :: SpockAction conn sess st sess
readSession =
do mgr <- getSessMgr
sm_readSession mgr
paramPathPiece :: PathPiece s => TL.Text -> SpockAction conn sess st s
paramPathPiece t =
do val <- param t
case fromPathPiece val of
Just x ->
return x
Nothing ->
raise $ stringError $ "Cannot convert param: " ++ TL.unpack t ++ " to path piece!"