packages feed

webgear-openapi-1.3.0: src/WebGear/OpenApi/Trait/Cookie.hs

{-# OPTIONS_GHC -Wno-orphans #-}

-- | OpenApi implementation of 'WG.Cookie' and 'WG.SetCookie' traits.
module WebGear.OpenApi.Trait.Cookie () where

import Data.OpenApi hiding (Response)
import Data.Proxy (Proxy (Proxy))
import Data.String (fromString)
import Data.Text (Text)
import GHC.TypeLits (KnownSymbol, symbolVal)
import WebGear.Core.Trait (Get (..), Set (..))
import qualified WebGear.Core.Trait.Cookie as WG
import WebGear.OpenApi.Handler (OpenApiHandler (..))
import WebGear.OpenApi.Trait.Auth (addSecurityScheme)

instance (KnownSymbol name) => Get (OpenApiHandler m) (WG.Cookie e name val) where
  {-# INLINE getTrait #-}
  getTrait WG.Cookie =
    OpenApiHandler $ addSecurityScheme cookieName securityScheme
    where
      cookieName = fromString @Text $ symbolVal $ Proxy @name

      securityScheme :: SecurityScheme
      securityScheme =
        SecurityScheme
          { _securitySchemeType =
              SecuritySchemeApiKey
                ApiKeyParams
                  { _apiKeyName = cookieName
                  , _apiKeyIn = ApiKeyCookie
                  }
          , _securitySchemeDescription = Nothing
          }

-- Response cookie information is not captured by OpenAPI

instance Set (OpenApiHandler m) (WG.SetCookie e name) where
  {-# INLINE setTrait #-}
  setTrait WG.SetCookie _ = OpenApiHandler pure