solidabis-koodihaaste/src/Solidabis/API.hs

62 lines
2.0 KiB
Haskell

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Solidabis.API where
import Control.Exception (throwIO)
import Control.Monad.Reader (MonadReader, asks)
import Control.Monad.Trans (MonadIO, liftIO)
import Data.Aeson
import Data.String (IsString)
import Data.Text (Text)
import Servant
import Servant.API.Generic
import Servant.Client
import Servant.Client.Core.Auth
import Servant.Client.Core.Request (Request)
import qualified Servant.Client.Core.Request as Req
import Servant.Client.Generic
newtype Message = Message { message :: Text }
deriving Generic
newtype Bullshit
= Bullshit { bullshits :: [ Message ] }
deriving Generic
instance FromJSON Bullshit
instance FromJSON Message
newtype API route
= API { _bullshit :: route :- AuthProtect "jwt" :> "bullshit" :> Get '[JSON] Bullshit }
deriving (Generic)
class HasClientEnv a where
getClientEnv :: a -> ClientEnv
setClientEnv :: a -> ClientEnv -> ClientEnv
instance HasClientEnv ClientEnv where
getClientEnv = id
setClientEnv = const
routes :: (MonadReader r m, MonadIO m, HasClientEnv r) => API (AsClientT m)
routes = genericClientHoist
(\x -> asks getClientEnv >>= \env -> liftIO (runClientM x env >>= either throwIO return))
newtype Token = Token String
deriving (Semigroup, Monoid, ToHttpApiData, IsString)
type instance AuthClientData (AuthProtect "jwt") = Token
authReq :: Token -> Request -> Request
authReq token = Req.addHeader "Authorization" ("Bearer " <> token)
getBullshits
:: (MonadReader r m, MonadIO m, HasClientEnv r)
=> Token
-> m Bullshit
getBullshits token = _bullshit routes (mkAuthenticatedRequest token authReq)