{-# OPTIONS_GHC -Wno-orphans #-}

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

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

instance
  (TraitAbsence (JWTAuth' x scheme m e a) Request, KnownSymbol scheme) =>
  Get (OpenApiHandler m) (JWTAuth' x scheme m e a) Request
  where
  {-# INLINEABLE getTrait #-}
  getTrait ::
    JWTAuth' x scheme m e a ->
    OpenApiHandler m (Linked ts Request) (Either (Absence (JWTAuth' x scheme m e a) Request) (Attribute (JWTAuth' x scheme m e a) Request))
  getTrait :: JWTAuth' x scheme m e a
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (JWTAuth' x scheme m e a) Request)
        (Attribute (JWTAuth' x scheme m e a) Request))
getTrait JWTAuth' x scheme m e a
_ =
    let schemeName :: Text
schemeName = Text
"http" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
forall a. IsString a => String -> a
fromString (Proxy scheme -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy scheme
forall k (t :: k). Proxy t
Proxy @scheme))
        securityScheme :: SecurityScheme
securityScheme =
          SecurityScheme :: SecuritySchemeType -> Maybe Text -> SecurityScheme
SecurityScheme
            { _securitySchemeType :: SecuritySchemeType
_securitySchemeType = HttpSchemeType -> SecuritySchemeType
SecuritySchemeHttp (Maybe Text -> HttpSchemeType
HttpSchemeBearer (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"JWT"))
            , _securitySchemeDescription :: Maybe Text
_securitySchemeDescription = Maybe Text
forall a. Maybe a
Nothing
            }
     in Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (JWTAuth' x scheme m e a) Request)
        (Attribute (JWTAuth' x scheme m e a) Request))
forall k k k (m :: k) (a :: k) (b :: k).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler (Tree DocNode
 -> OpenApiHandler
      m
      (Linked ts Request)
      (Either
         (Absence (JWTAuth' x scheme m e a) Request)
         (Attribute (JWTAuth' x scheme m e a) Request)))
-> Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (JWTAuth' x scheme m e a) Request)
        (Attribute (JWTAuth' x scheme m e a) Request))
forall a b. (a -> b) -> a -> b
$ DocNode -> Tree DocNode
forall a. a -> Tree a
singletonNode (Text -> SecurityScheme -> DocNode
DocSecurityScheme Text
schemeName SecurityScheme
securityScheme)