module Alerta.Auth
( WithApiKey
, NeedApiKey
) where
import Alerta.Types (ApiKey(..))
import Data.Typeable (Typeable)
import Data.Monoid ((<>))
import Data.Proxy
import Servant.Common.Req (Req, addHeader)
import Servant.Client
import Servant.API ((:>))
data NeedApiKey deriving Typeable
data WithApiKey deriving Typeable
addApiKey :: ApiKey -> Req -> Req
addApiKey (ApiKey key) = addHeader "Authorization" ("Key " <> key)
type instance AuthClientData NeedApiKey = ApiKey
instance HasClient api => HasClient (NeedApiKey :> api) where
type Client (NeedApiKey :> api) = ApiKey -> Client api
clientWithRoute _ req k =
clientWithRoute (Proxy :: Proxy api) (addApiKey k req)
type instance AuthClientData WithApiKey = Maybe ApiKey
instance HasClient api => HasClient (WithApiKey :> api) where
type Client (WithApiKey :> api) = Maybe ApiKey -> Client api
clientWithRoute _ req m =
clientWithRoute (Proxy :: Proxy api) (maybe id addApiKey m req)