{-#LANGUAGE NoImplicitPrelude #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE TypeFamilies #-}
{-#LANGUAGE MultiParamTypeClasses #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE FlexibleContexts #-}
{-#LANGUAGE LambdaCase #-}
module Web.Sprinkles.Backends.Loader.Type
where
import Web.Sprinkles.Prelude
import qualified Network.Wai as Wai
import Network.HTTP.Types (HeaderName)
import Web.Sprinkles.SessionHandle (SessionHandle)
import Debug.Trace (trace)
import Web.Sprinkles.Backends.Data
( BackendData (..)
, BackendMeta (..)
, BackendSource (..)
, Items (..)
, reduceItems
)
import Web.Sprinkles.Backends.Spec
( FetchMode (..)
, FetchOrder (..)
)
import Web.Sprinkles.Logger (LogLevel)
data RequestContext =
RequestContext
{ loadPost :: IO LByteString
, sessionHandle :: Maybe SessionHandle
, lookupHeader :: HeaderName -> Maybe ByteString
}
contentType :: RequestContext -> ByteString
contentType rqc = fromMaybe "text/plain" $ lookupHeader rqc "Content-type"
type Loader = (LogLevel -> Text -> IO ())
-> RequestContext
-> FetchMode
-> FetchOrder
-> IO [BackendSource]
pbsFromRequest :: Wai.Request -> Maybe SessionHandle -> RequestContext
pbsFromRequest request session =
RequestContext
{ loadPost = Wai.lazyRequestBody request
, sessionHandle = session
, lookupHeader = \name ->
lookup name (Wai.requestHeaders request)
}
pbsInvalid :: RequestContext
pbsInvalid =
RequestContext
{ loadPost = fail "POST body not available"
, sessionHandle = Nothing
, lookupHeader = const Nothing
}