| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
IHP.ControllerSupport
Synopsis
- type Action' = IO ResponseReceived
- (|>) :: a -> (a -> b) -> b
- getRequestBody :: (?request :: Request) => IO ByteString
- getRequestPath :: (?request :: Request) => ByteString
- getRequestPathAndQuery :: (?request :: Request) => ByteString
- getHeader :: (?request :: Request) => ByteString -> Maybe ByteString
- request :: (?request :: Request) => Request
- requestHeaders :: Request -> RequestHeaders
- getFiles :: (?request :: Request) => [File ByteString]
- class (Show controller, Eq controller) => Controller controller where
- beforeAction :: IO ()
- action :: controller -> IO ()
- runAction :: (Controller controller, ?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => controller -> IO ResponseReceived
- data ControllerContext
- class InitControllerContext (application :: k) where
- initContext :: IO ()
- runActionWithNewContext :: forall application controller. (Controller controller, ?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, Typeable controller) => controller -> IO ResponseReceived
- newContextForAction :: forall application controller. (Controller controller, ?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, Typeable controller) => controller -> IO (Either (IO ResponseReceived) ControllerContext)
- respondAndExit :: Response -> IO ()
- respondAndExitWithHeaders :: (?request :: Request) => Response -> IO ()
- jumpToAction :: (Controller action, ?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => action -> IO ()
- requestBodyJSON :: (?request :: Request) => Value
- startWebSocketApp :: forall webSocketApp application. (?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, WSApp webSocketApp) => webSocketApp -> IO ResponseReceived -> Application
- startWebSocketAppAndFailOnHTTP :: forall webSocketApp application. (?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, WSApp webSocketApp) => webSocketApp -> Application
- setHeader :: (?request :: Request) => Header -> IO ()
- getAppConfig :: forall configParameter context. (?context :: context, ConfigProvider context, Typeable configParameter) => configParameter
- type Respond = Response -> IO ResponseReceived
- data Request
- rlsContextVaultKey :: Key (IORef (Maybe RowLevelSecurityContext))
- setupActionContext :: (InitControllerContext application, ?application :: application, Typeable application) => TypeRep -> Request -> Respond -> IO (ControllerContext, Maybe SomeException)
Documentation
type Action' = IO ResponseReceived Source #
getRequestBody :: (?request :: Request) => IO ByteString Source #
getRequestPath :: (?request :: Request) => ByteString Source #
Returns the request path, e.g. /Users or /CreateUser
getRequestPathAndQuery :: (?request :: Request) => ByteString Source #
Returns the request path and the query params, e.g. /ShowUser?userId=9bd6b37b-2e53-40a4-bb7b-fdba67d6af42
getHeader :: (?request :: Request) => ByteString -> Maybe ByteString Source #
Returns a header value for a given header name. Returns Nothing if not found
The header is looked up in a case insensitive way.
>>>getHeader "Content-Type"Just "text/html"
>>>getHeader "X-My-Custom-Header"Nothing
request :: (?request :: Request) => Request Source #
Returns the current HTTP request.
See https://hackage.haskell.org/package/wai-3.2.2.1/docs/Network-Wai.html#t:Request
requestHeaders :: Request -> RequestHeaders Source #
A list of headers (a pair of key and value) in an HTTP request.
class (Show controller, Eq controller) => Controller controller where Source #
Minimal complete definition
runAction :: (Controller controller, ?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => controller -> IO ResponseReceived Source #
data ControllerContext #
Instances
| HasField "frameworkConfig" ControllerContext FrameworkConfig Source # | Access frameworkConfig via the request vault |
Defined in IHP.Controller.Context Methods | |
| HasField "logger" ControllerContext Logger Source # | |
Defined in IHP.Controller.Context Methods getField :: ControllerContext -> Logger # | |
| HasField "request" ControllerContext Request Source # | Access request from the TMap This allows |
Defined in IHP.Controller.Context Methods getField :: ControllerContext -> Request # | |
class InitControllerContext (application :: k) where Source #
Minimal complete definition
Nothing
Methods
initContext :: IO () Source #
Instances
| InitControllerContext () Source # | |
Defined in IHP.ControllerSupport Methods initContext :: IO () Source # | |
runActionWithNewContext :: forall application controller. (Controller controller, ?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, Typeable controller) => controller -> IO ResponseReceived Source #
newContextForAction :: forall application controller. (Controller controller, ?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, Typeable controller) => controller -> IO (Either (IO ResponseReceived) ControllerContext) Source #
respondAndExit :: Response -> IO () Source #
Simple version - just throws the response, no context needed
respondAndExitWithHeaders :: (?request :: Request) => Response -> IO () Source #
Version that adds headers from context (for render, etc.)
jumpToAction :: (Controller action, ?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => action -> IO () Source #
requestBodyJSON :: (?request :: Request) => Value Source #
startWebSocketApp :: forall webSocketApp application. (?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, WSApp webSocketApp) => webSocketApp -> IO ResponseReceived -> Application Source #
startWebSocketAppAndFailOnHTTP :: forall webSocketApp application. (?request :: Request, ?respond :: Respond, InitControllerContext application, ?application :: application, Typeable application, WSApp webSocketApp) => webSocketApp -> Application Source #
setHeader :: (?request :: Request) => Header -> IO () Source #
Set a header value for a given header name.
>>>setHeader ("Content-Language", "en")
getAppConfig :: forall configParameter context. (?context :: context, ConfigProvider context, Typeable configParameter) => configParameter Source #
Returns a custom config parameter
>>>getAppConfig @StripePublicKeyStripePublicKey "pk_test_..."
Example:
First you need to define a custom config parameter in Config.hs:
-- Config/Config.hs
newtype StripePublicKey = StripePublicKey Text
config :: ConfigBuilder
config = do
-- ...
stripePublicKey <- StripePublicKey <$> env @Text "STRIPE_PUBLIC_KEY"
option stripePublicKeyThen you can access it using getAppConfig:
action MyAction = do
let (StripePublicKey stripePublicKey) = getAppConfig @StripePublicKey
putStrLn ("Stripe public key: " <> stripePublicKey)type Respond = Response -> IO ResponseReceived #
Information on the request sent by the client. This abstracts away the details of the underlying implementation.
Instances
setupActionContext :: (InitControllerContext application, ?application :: application, Typeable application) => TypeRep -> Request -> Respond -> IO (ControllerContext, Maybe SomeException) Source #
Shared request context setup, specialized once per application type. Takes a pre-computed TypeRep to avoid per-controller-type code duplication. NOINLINE ensures GHC compiles one copy shared across all controllers.
Returns (controllerContext, Nothing) on success, or
(controllerContext, Just exception) if initContext failed.
The context is always returned so callers can use it for error rendering.