{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeOperators #-} module Mollie.API.Payments ( PaymentAPI , newPayment , newRecurringPayment , createPayment , getPayment , getPayments , getPaymentsPaginated , cancelPayment ) where import Control.Lens ((&), (.~)) import Data.Default (def) import qualified Data.Text as Text import Mollie.API.Internal (HalJSON) import Mollie.API.Types import Servant.API import Servant.API.Generic {-| Helper to create a minimal new payment for normal use. -} newPayment :: Double -- ^ _amount -> Text.Text -- ^ _description -> Text.Text -- ^ _redirectUrl -> NewPayment newPayment _amount _description _redirectUrl = (newRecurringPayment _amount _description) & redirectUrl .~ Just _redirectUrl & sequenceType .~ Just Oneoff {-| Helper to create a minimal new payment for recurring use. A payment created with this helper should be sent with the `createCustomerPayment` from `Mollie.API.Customers` or have the customerId set. For a first recurring payment use `newPayment` and set the recurring type to `First`, because it needs a return url. -} newRecurringPayment :: Double -- ^ _amount -> Text.Text -- ^ _description -> NewPayment newRecurringPayment _amount _description = def & amount .~ (defaultAmount _amount) & description .~ _description & redirectUrl .~ Nothing & webhookUrl .~ Nothing & method .~ Nothing & metadata .~ Nothing & locale .~ Nothing & sequenceType .~ Just Recurring & customerId .~ Nothing & mandateId .~ Nothing & issuer .~ Nothing & billingAddress .~ Nothing & shippingAddress .~ Nothing & billingEmail .~ Nothing & dueDate .~ Nothing & consumerName .~ Nothing & consumerAccount .~ Nothing & customerReference .~ Nothing data PaymentAPI route = PaymentAPI { getPaymentsPaginated :: route :- "payments" :> QueryParam "limit" Int :> QueryParam "from" PaymentId :> Get '[HalJSON] (List Payment) -- ^Handler to get a paginated list of payments. Offset the results by passing the last payment ID in the `from` query param. The payment with this ID is included in the result set as well. See https://docs.mollie.com/reference/v2/payments-api/list-payments -- -- Example for fetching the last 10 payments: -- -- @ -- import Mollie.API -- import Mollie.API.Payments -- -- env <- createEnv "test_mollieapikeyexample" -- let paymentsResult = runMollie env (getPaymentsPaginated paymentClient (Just 10) Nothing) -- @ , getPayments :: route :- "payments" :> Get '[HalJSON] (List Payment) -- ^Handler to get a paginated list of payments. Applies default pagination for newest 250 customers. See https://docs.mollie.com/reference/v2/payments-api/list-payments , createPayment :: route :- "payments" :> ReqBody '[JSON] NewPayment :> Post '[HalJSON] Payment -- ^Handler to create a new payment. See https://docs.mollie.com/reference/v2/payments-api/create-payment , getPayment :: route :- "payments" :> Capture "id" PaymentId :> Get '[HalJSON] Payment -- ^Handler to get a payment by its identifier. See https://docs.mollie.com/reference/v2/payments-api/create-payment , cancelPayment :: route :- "payments" :> Capture "id" PaymentId :> Delete '[HalJSON] Payment -- ^Handler to cancel a payment by its identifier. See https://docs.mollie.com/reference/v2/payments-api/cancel-payment } deriving Generic