{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Mollie.API
( MollieServantAPI
, MollieAPI
, HalJSON
, chargebackClient
, customerClient
, mandateClient
, methodClient
, paymentClient
, refundClient
, subscriptionClient
, createEnv
, runMollie
, module Mollie.API.Types
) where
import Data.Proxy (Proxy (..))
import GHC.Generics (Generic)
import Mollie.API.Chargebacks (ChargebackAPI)
import Mollie.API.Customers (CustomerAPI)
import Mollie.API.Internal
import Mollie.API.Mandates (MandateAPI)
import Mollie.API.Methods (MethodAPI)
import Mollie.API.Payments (PaymentAPI)
import Mollie.API.Refunds (RefundAPI)
import Mollie.API.Subscriptions (SubscriptionAPI)
import Mollie.API.Types
import Servant.API
import Servant.API.Generic
import Servant.Client
import Servant.Client.Generic
-- import qualified Paths_mollie_api_haskell as Self
{-|
All v2 endpoints of Mollie API.
-}
data MollieAPI route = MollieAPI
{ customerAPI :: route :- ToServantApi CustomerAPI
, chargebackAPI :: route :- ToServantApi ChargebackAPI
, methodAPI :: route :- ToServantApi MethodAPI
, mandateAPI :: route :- ToServantApi MandateAPI
, paymentAPI :: route :- ToServantApi PaymentAPI
, refundAPI :: route :- ToServantApi RefundAPI
, subscriptionAPI :: route :- ToServantApi SubscriptionAPI
} deriving Generic
{-|
The fully combined Mollie API definition of Haskell.
-}
type MollieServantAPI = "v2" :> ToServantApi MollieAPI
servantApi :: Proxy MollieServantAPI
servantApi = Proxy
{-|
Record that holds the endpoints for the Chargeback API.
Usage:
@
import Mollie.API
import Mollie.API.Chargebacks
env <- createEnv "test_mollieapikeyexample"
let chargebacksResult = runMollie env (getChargebacks chargebackClient)
@
-}
chargebackClient :: ChargebackAPI (AsClientT ClientM)
chargebackClient = fromServant $ chargebackAPI mollieClient
{-|
Record that holds the endpoints for the Customer API.
Usage:
@
import Mollie.API
import Mollie.API.Customers
env <- createEnv "test_mollieapikeyexample"
let customersResult = runMollie env (getCustomers customerClient)
@
-}
customerClient :: CustomerAPI (AsClientT ClientM)
customerClient = fromServant $ customerAPI mollieClient
{-|
Record that holds the endpoints for the Method API.
Usage:
@
import Mollie.API
import Mollie.API.Methods
env <- createEnv "test_mollieapikeyexample"
let methodsResult = runMollie env (getMethods methodClient)
@
-}
methodClient :: MethodAPI (AsClientT ClientM)
methodClient = fromServant $ methodAPI mollieClient
{-|
Record that holds the endpoints for the Mandate API.
Usage:
@
import Mollie.API
import Mollie.API.Mandates
env <- createEnv "test_mollieapikeyexample"
let mandatesResult = runMollie env ((getCustomerMandates mandateClient) "cst_eaaEuAnqW")
@
-}
mandateClient :: MandateAPI (AsClientT ClientM)
mandateClient = fromServant $ mandateAPI mollieClient
{-|
Record that holds the endpoints for the Payments API.
Usage:
@
import Mollie.API
import Mollie.API.Payments
env <- createEnv "test_mollieapikeyexample"
let paymentsResult = runMollie env (getPayments paymentClient)
@
-}
paymentClient :: PaymentAPI (AsClientT ClientM)
paymentClient = fromServant $ paymentAPI mollieClient
{-|
Record that holds the endpoints for the Refunds API.
Usage:
@
import Mollie.API
import Mollie.API.Refunds
env <- createEnv "test_mollieapikeyexample"
let refundsResult = runMollie env (getRefunds refundClient)
@
-}
refundClient :: RefundAPI (AsClientT ClientM)
refundClient = fromServant $ refundAPI mollieClient
{-|
Record that holds the endpoints for the Subscriptions API.
Usage:
@
import Mollie.API
import Mollie.API.Subscriptions
env <- createEnv "test_mollieapikeyexample"
let subscriptionsResult = runMollie env ((getCustomerSubscriptions refundClient) "cst_eaaEuAnqW")
@
-}
subscriptionClient :: SubscriptionAPI (AsClientT ClientM)
subscriptionClient = fromServant $ subscriptionAPI mollieClient
mollieClient :: MollieAPI (AsClientT ClientM)
mollieClient = fromServant $ client servantApi
{-|
Execute an API call to the Mollie API. Uses Servant under the hood.
-}
runMollie :: ClientEnv -> ClientM a -> IO (Either ResponseError a)
runMollie env apiFunction = do
res <- runClientM apiFunction env
return $ mapLeft handleError res
where
mapLeft :: (a -> c) -> Either a b -> Either c b
mapLeft f (Left x) = Left (f x)
mapLeft _ (Right x) = Right x