{-| Module : Twfy.Client Description : Client -} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module Twfy.Client ( A.ApiKey , Client(..) , client , getConstituency , getConstituencies , getMP , getMPs ) where import Servant.Client hiding(Client(..), client) import Network.HTTP.Client (Manager, newManager) import Network.HTTP.Client.TLS (tlsManagerSettings) import Servant.Common.BaseUrl (parseBaseUrl) import qualified Data.Text as T import qualified Twfy.Api as A import Twfy.Data.Constituency import Twfy.Data.MP -- | Client - very subject to change, use the 'client' function to create data Client = Client { clientApiKey :: A.ApiKey -- ^ API Key , clientApiUri :: String -- ^ API URL , clientManager :: Manager -- ^ HTTP client manager , clientEnv :: ClientEnv -- ^ Servant client env } instance Show Client where show c = let k = show (clientApiKey c) u = show (clientApiUri c) in "twfy-client: " ++ k ++ " - " ++ u -- | Create a client. -- client :: A.ApiKey -- ^ API Key -> Maybe String -- ^ API URI - defaults to "https://www.theyworkforyou.com/api" -> Maybe Manager -- ^ HTTP Client manager - uses default TLS settings if not provided -> IO Client client k u m = let defaultUri = "https://www.theyworkforyou.com/api" defaultManagerAction = newManager tlsManagerSettings key = k uri = maybe defaultUri id u in do baseUrl <- parseBaseUrl uri manager <- maybe defaultManagerAction return m let env = ClientEnv manager baseUrl return $ Client key uri manager env -- | The 'getConstituency' function retreives a constituency based on name or post code getConstituency :: Client -> Maybe T.Text -- ^ Name -> Maybe T.Text -- ^ Post code -> IO (Either ServantError Constituency) getConstituency c = do let key = Just $ clientApiKey c env = clientEnv c (\name postCode -> (flip runClientM) env (A.getConstituency key name postCode)) -- | The 'getConstituencies' function retreives all constituencies getConstituencies :: Client -> IO (Either ServantError [Constituency]) getConstituencies c = do let key = Just $ clientApiKey c env = clientEnv c (flip runClientM) env (A.getConstituencies key) -- | The 'getMP' function retreives an MP getMP :: Client -> Maybe Int -- ^ Id -> Maybe T.Text -- ^ Constituency name -> Maybe T.Text -- ^ Post code -> Maybe Bool -- ^ Always return -> IO (Either ServantError MP) getMP c = do let key = Just $ clientApiKey c env = clientEnv c (\mpId constituencyName postCode alwaysReturn -> (flip runClientM) env (A.getMP key mpId constituencyName postCode alwaysReturn)) -- | The 'getMPs' function retreives a list of MPs getMPs :: Client -> Maybe T.Text -- ^ Name search -> Maybe T.Text -- ^ Party name -> Maybe T.Text -- ^ Date -> IO (Either ServantError [MP]) getMPs c = do let key = Just $ clientApiKey c env = clientEnv c (\personName partyName date -> (flip runClientM) env (A.getMPs key personName partyName date))