{-|
Module: IHP.Controller.Cookie
Description: Set Cookies
Copyright: (c) digitally induced GmbH, 2022
-}
module IHP.Controller.Cookie (setCookie, getCookie, allCookies) where

import IHP.Prelude
import IHP.ControllerSupport
import Web.Cookie
import qualified Data.Binary.Builder as Binary
import qualified Data.ByteString.Lazy as LBS

-- | Sets a @Set-Cookie@ header
--
-- > import Web.Cookie
-- >
-- > action MyAction = do
-- >     setCookie defaultSetCookie
-- >             { setCookieName = "exampleCookie"
-- >             , setCookieValue = "exampleValue"
-- >             }
-- 
setCookie :: (?request :: Request) => SetCookie -> IO ()
setCookie :: (?request::Request) => SetCookie -> IO ()
setCookie SetCookie
cookie = (?request::Request) => Header -> IO ()
Header -> IO ()
setHeader (HeaderName
"Set-Cookie", ByteString
cookieString)
    where
        cookieString :: ByteString
cookieString = SetCookie
cookie
                SetCookie -> (SetCookie -> Builder) -> Builder
forall a b. a -> (a -> b) -> b
|> SetCookie -> Builder
renderSetCookie
                Builder -> (Builder -> LazyByteString) -> LazyByteString
forall a b. a -> (a -> b) -> b
|> Builder -> LazyByteString
Binary.toLazyByteString
                LazyByteString -> (LazyByteString -> ByteString) -> ByteString
forall a b. a -> (a -> b) -> b
|> LazyByteString -> ByteString
LBS.toStrict

-- | Returns a cookie by it's name
--
-- > getCookie "fbc"
-- Just "1234"
--
getCookie :: (?request :: Request) => Text -> Maybe Text
getCookie :: (?request::Request) => Text -> Maybe Text
getCookie Text
name =
    Text -> [(Text, Text)] -> Maybe Text
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Text
name [(Text, Text)]
(?request::Request) => [(Text, Text)]
allCookies

-- | Returns all cookies sent with the current request
allCookies :: (?request :: Request) => [(Text, Text)]
allCookies :: (?request::Request) => [(Text, Text)]
allCookies =
    [(Text, Text)]
-> (ByteString -> [(Text, Text)])
-> Maybe ByteString
-> [(Text, Text)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ByteString -> [(Text, Text)]
parseCookiesText (Maybe ByteString -> [(Text, Text)])
-> Maybe ByteString -> [(Text, Text)]
forall a b. (a -> b) -> a -> b
$ HeaderName -> [Header] -> Maybe ByteString
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup HeaderName
"Cookie" Request
(?request::Request) => Request
request.requestHeaders