packages feed

webgear-swagger-1.1.0: src/WebGear/Swagger/Trait/Auth/JWT.hs

{-# OPTIONS_GHC -Wno-orphans #-}

-- | Swagger implementation of 'JWTAuth'' trait.
module WebGear.Swagger.Trait.Auth.JWT where

import Data.String (fromString)
import Data.Swagger
import Data.Typeable (Proxy (..))
import GHC.TypeLits (KnownSymbol, symbolVal)
import WebGear.Core.Request (Request)
import WebGear.Core.Trait (Attribute, Get (..), TraitAbsence (..), With)
import WebGear.Core.Trait.Auth.JWT (JWTAuth' (..))
import WebGear.Swagger.Handler (DocNode (DocSecurityScheme), SwaggerHandler (..), singletonNode)

instance
  (TraitAbsence (JWTAuth' x scheme m e a) Request, KnownSymbol scheme) =>
  Get (SwaggerHandler m) (JWTAuth' x scheme m e a) Request
  where
  {-# INLINE getTrait #-}
  getTrait ::
    JWTAuth' x scheme m e a ->
    SwaggerHandler m (Request `With` ts) (Either (Absence (JWTAuth' x scheme m e a) Request) (Attribute (JWTAuth' x scheme m e a) Request))
  getTrait _ =
    let schemeName = fromString (symbolVal (Proxy @scheme))
        -- Swagger 2.0 does not support JWT: https://stackoverflow.com/a/32995636
        securityScheme =
          SecurityScheme
            { _securitySchemeType =
                SecuritySchemeApiKey
                  ( ApiKeyParams
                      { _apiKeyName = "JWT"
                      , _apiKeyIn = ApiKeyHeader
                      }
                  )
            , _securitySchemeDescription = Just ("Enter the token with the `" <> schemeName <> ": ` prefix")
            }
     in SwaggerHandler $ singletonNode (DocSecurityScheme schemeName securityScheme)