{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Alerta.Auth
( WithApiKey
, NeedApiKey
) where
import Alerta.Types (ApiKey (..))
import Data.Monoid ((<>))
import Data.Proxy
import Data.Typeable (Typeable)
import Servant.API ((:>))
import Servant.Client
import Servant.Common.Req (Req, addHeader)
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)