stripe-core-2.0.0: src/Web/Stripe/Card.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
-------------------------------------------
-- |
-- Module : Web.Stripe.Card
-- Copyright : (c) David Johnson, 2014
-- Maintainer : djohnson.m@gmail.com
-- Stability : experimental
-- Portability : POSIX
--
-- < https:/\/\stripe.com/docs/api#cards >
--
-- @
-- {-\# LANGUAGE OverloadedStrings \#-}
-- import Web.Stripe
-- import Web.Stripe.Customer
-- import Web.Stripe.Card
--
-- main :: IO ()
-- main = do
-- let config = StripeConfig (StripeKey "secret_key")
-- credit = CardNumber "4242424242424242"
-- em = ExpMonth 12
-- ey = ExpYear 2015
-- cvc = CVC "123"
-- cardinfo = (mkNewCard credit em ey) { newCardCVC = Just cvc }
-- result <- stripe config $ createCustomer
-- case result of
-- (Left stripeError) -> print stripeError
-- (Right (Customer { customerId = cid })) -> do
-- result <- stripe config $ createCustomerCard cid cardinfo
-- case result of
-- Right card -> print card
-- Left stripeError -> print stripeError
-- @
module Web.Stripe.Card
( -- * API
-- ** Customers
-- *** Create Card
CreateCustomerCardByToken
, createCustomerCardByToken
, CreateRecipientCardByToken
, createRecipientCardByToken
, CreateCustomerCard
, createCustomerCard
, CreateRecipientCard
, createRecipientCard
-- *** Get Card(s)
, GetCustomerCard
, getCustomerCard
, GetRecipientCard
, getRecipientCard
, GetCustomerCards
, getCustomerCards
, GetRecipientCards
, getRecipientCards
-- *** Update Card
, UpdateCustomerCard
, updateCustomerCard
, UpdateRecipientCard
, updateRecipientCard
-- *** Delete Card
, DeleteCustomerCard
, deleteCustomerCard
, DeleteRecipientCard
, deleteRecipientCard
-- * Types
, AddressLine1 (..)
, AddressLine2 (..)
, AddressCity (..)
, AddressCountry (..)
, AddressState (..)
, AddressZip (..)
, Brand (..)
, Card (..)
, CardId (..)
, CardNumber (..)
, CVC (..)
, EndingBefore (..)
, ExpandParams (..)
, ExpMonth (..)
, ExpYear (..)
, Limit (..)
, Name (..)
, RecipientCard (..)
, RecipientCardId (..)
, RecipientId (..)
, StartingAfter (..)
) where
import Data.Text (Text)
import Web.Stripe.StripeRequest (Method (GET, POST, DELETE),
StripeHasParam, StripeRequest (..),
StripeReturn, ToStripeParam(..),
mkStripeRequest)
import Web.Stripe.Util ((</>))
import Web.Stripe.Types (AddressLine1(..), AddressLine2(..)
, AddressCity(..), AddressCountry(..)
, AddressState(..), AddressZip(..)
, Brand(..), Card(..), CardId(..)
, CardNumber(..), CustomerId(..)
, CVC(..), EndingBefore(..)
, ExpandParams(..)
, ExpMonth(..), ExpYear(..), ID
, Limit(..), Name(..), NewCard(..)
, RecipientCard(..)
, RecipientId(..), RecipientCardId(..)
, StartingAfter(..)
, StripeDeleteResult(..)
, StripeList(..), TokenId(..), URL)
import Web.Stripe.Types.Util (getCustomerId, getRecipientId)
------------------------------------------------------------------------------
-- | INTERNAL: generalized `Card` creation from a `TokenId`
createCardByToken
:: URL -- ^ "customer" or "recepient"
-> ID -- ^ id of customer or recipient
-> TokenId -- ^ `TokenId` of card to add
-> StripeRequest a
createCardByToken
prefix
id_
tokenid = request
where request = mkStripeRequest POST url params
url = prefix </> id_ </> "cards"
params = toStripeParam tokenid []
------------------------------------------------------------------------------
-- | `Customer` `Card` creation from a `TokenId`
createCustomerCardByToken
:: CustomerId -- ^ `CustomerId` of card holder
-> TokenId -- ^ `TokenId` of card to add
-> StripeRequest CreateCustomerCardByToken
createCustomerCardByToken
customerid
tokenid =
createCardByToken "customers" (getCustomerId customerid) tokenid
data CreateCustomerCardByToken
type instance StripeReturn CreateCustomerCardByToken = Card
------------------------------------------------------------------------------
-- | `Recipient` `Card` creation from a `TokenId`
createRecipientCardByToken
:: RecipientId -- ^ `RecipientId` of card holder
-> TokenId -- ^ `TokenId` of card to add
-> StripeRequest CreateRecipientCardByToken
createRecipientCardByToken
recipientid
tokenid =
createCardByToken "recipients" (getRecipientId recipientid) tokenid
data CreateRecipientCardByToken
type instance StripeReturn CreateRecipientCardByToken = RecipientCard
------------------------------------------------------------------------------
-- | INTERNAL: generalized `Card` creation from card info
createCard
:: URL
-> ID
-> NewCard
-> StripeRequest a
createCard
prefix
id_
newCard = request
where request = mkStripeRequest POST url params
url = prefix </> id_ </> "cards"
params = toStripeParam newCard []
------------------------------------------------------------------------------
-- | `Customer` `Card` creation from card info
createCustomerCard
:: CustomerId -- ^ `RecipientId` of card holder
-> NewCard -- ^ `NewCard` data for the card
-> StripeRequest CreateCustomerCard
createCustomerCard
customerid
newCard = createCard "customers" (getCustomerId customerid) newCard
data CreateCustomerCard
type instance StripeReturn CreateCustomerCard = Card
------------------------------------------------------------------------------
-- | `Recipient` `Card` creation from card info
createRecipientCard
:: RecipientId -- ^ `RecipientId` of card holder
-> NewCard -- ^ `NewCard` data for the card
-> StripeRequest CreateRecipientCard
createRecipientCard
recipientid
newCard = createCard "recipients" (getRecipientId recipientid) newCard
data CreateRecipientCard
type instance StripeReturn CreateRecipientCard = RecipientCard
------------------------------------------------------------------------------
-- | INTERNAL: generalized Get card by `CustomerId` and `CardId`
getCard
:: URL
-> ID
-> Text -- card id
-> StripeRequest a
getCard
prefix
id_
cardid_ = request
where request = mkStripeRequest GET url params
url = prefix </> id_ </>
"cards" </> cardid_
params = []
------------------------------------------------------------------------------
-- | Get card by `CustomerId` and `CardId`
getCustomerCard
:: CustomerId -- ^ `CustomerId` of the `Card` to retrieve
-> CardId -- ^ `CardId` of the card to retrieve
-> StripeRequest GetCustomerCard
getCustomerCard
customerid
(CardId cardid) = getCard "customers" (getCustomerId customerid) cardid
data GetCustomerCard
type instance StripeReturn GetCustomerCard = Card
instance StripeHasParam GetCustomerCard ExpandParams
------------------------------------------------------------------------------
-- | Get card by `RecipientId` and `RecipientCardId`
getRecipientCard
:: RecipientId -- ^ `RecipientId` of the `Card` to retrieve
-> RecipientCardId -- ^ `CardId` of the card to retrieve
-> StripeRequest GetRecipientCard
getRecipientCard
recipientid
(RecipientCardId cardid)
= getCard "recipients" (getRecipientId recipientid) cardid
data GetRecipientCard
type instance StripeReturn GetRecipientCard = RecipientCard
instance StripeHasParam GetRecipientCard ExpandParams
------------------------------------------------------------------------------
-- | INTERNAL: Generalized update a `Card`
updateCard
:: URL
-> ID
-> Text -- ^ cardid
-> StripeRequest a
updateCard
prefix
id_
cardid_ = request
where request = mkStripeRequest POST url params
url = prefix </> id_ </>
"cards" </> cardid_
params = []
------------------------------------------------------------------------------
-- | Update a `Customer` `Card`
updateCustomerCard
:: CustomerId -- ^ `CustomerId` of the card holder
-> CardId -- ^ `CardId` of card to update
-> StripeRequest UpdateCustomerCard
updateCustomerCard
customerid
(CardId cardid)
= updateCard "customers" (getCustomerId customerid) cardid
data UpdateCustomerCard
type instance StripeReturn UpdateCustomerCard = Card
instance StripeHasParam UpdateCustomerCard AddressLine1
instance StripeHasParam UpdateCustomerCard AddressLine2
instance StripeHasParam UpdateCustomerCard AddressCity
instance StripeHasParam UpdateCustomerCard AddressZip
instance StripeHasParam UpdateCustomerCard AddressState
instance StripeHasParam UpdateCustomerCard AddressCountry
instance StripeHasParam UpdateCustomerCard ExpMonth
instance StripeHasParam UpdateCustomerCard ExpYear
instance StripeHasParam UpdateCustomerCard Name
------------------------------------------------------------------------------
-- | Update a `Recipient` `Card`
updateRecipientCard
:: RecipientId -- ^ `RecipientId` of the card holder
-> RecipientCardId -- ^ `RecipientCardId` of the card to update
-> StripeRequest UpdateRecipientCard
updateRecipientCard
recipientid
(RecipientCardId cardid)
= updateCard "recipients" (getRecipientId recipientid) cardid
data UpdateRecipientCard
type instance StripeReturn UpdateRecipientCard = RecipientCard
instance StripeHasParam UpdateRecipientCard AddressLine1
instance StripeHasParam UpdateRecipientCard AddressLine2
instance StripeHasParam UpdateRecipientCard AddressCity
instance StripeHasParam UpdateRecipientCard AddressZip
instance StripeHasParam UpdateRecipientCard AddressState
instance StripeHasParam UpdateRecipientCard AddressCountry
instance StripeHasParam UpdateRecipientCard ExpMonth
instance StripeHasParam UpdateRecipientCard ExpYear
instance StripeHasParam UpdateRecipientCard Name
------------------------------------------------------------------------------
-- | INTERNAL: Generalized remove a card from a `Customer`
deleteCard
:: URL
-> ID
-> Text -- ^ `CardId` associated with `Card` to be deleted
-> StripeRequest a
deleteCard
prefix
id_
cardid_ = request
where request = mkStripeRequest DELETE url params
url = prefix </> id_ </> "cards" </> cardid_
params = []
------------------------------------------------------------------------------
-- | Removes a `Card` with from a `Customer`
deleteCustomerCard
:: CustomerId -- ^ `CustomerId` of the `Card` to be deleted
-> CardId -- ^ `CardId` associated with `Card` to be deleted
-> StripeRequest DeleteCustomerCard
deleteCustomerCard
customerid
(CardId cardid) = deleteCard "customers" (getCustomerId customerid) cardid
data DeleteCustomerCard
type instance StripeReturn DeleteCustomerCard = StripeDeleteResult
------------------------------------------------------------------------------
-- | Removes a `RecipientCard` with from a `Recipient`
deleteRecipientCard
:: RecipientId -- ^ `RecipientId` of the `Card` to retrieve
-> RecipientCardId -- ^ `CardId` associated with `Card` to be deleted
-> StripeRequest DeleteRecipientCard
deleteRecipientCard
recipientid
(RecipientCardId cardid)
= deleteCard "recipients" (getRecipientId recipientid) cardid
data DeleteRecipientCard
type instance StripeReturn DeleteRecipientCard = StripeDeleteResult
------------------------------------------------------------------------------
-- | INTERNAL: Generalized retrieve all cards for `ID`
getCards
:: URL
-> ID
-> StripeRequest a
getCards
prefix
id_
= request
where request = mkStripeRequest GET url params
url = prefix </> id_ </> "cards"
params = []
------------------------------------------------------------------------------
-- | Retrieve all cards associated with a `Customer`
getCustomerCards
:: CustomerId -- ^ The `CustomerId` associated with the cards
-> StripeRequest GetCustomerCards
getCustomerCards
customerid
= getCards "customers" (getCustomerId customerid)
data GetCustomerCards
type instance StripeReturn GetCustomerCards = (StripeList Card)
instance StripeHasParam GetCustomerCards ExpandParams
instance StripeHasParam GetCustomerCards (EndingBefore CardId)
instance StripeHasParam GetCustomerCards Limit
instance StripeHasParam GetCustomerCards (StartingAfter CardId)
------------------------------------------------------------------------------
-- | Retrieve all cards associated with a `Recipient`
getRecipientCards
:: RecipientId -- ^ The `RecipientId` associated with the cards
-> StripeRequest GetRecipientCards
getRecipientCards
recipientid
= getCards "recipients" (getRecipientId recipientid)
data GetRecipientCards
type instance StripeReturn GetRecipientCards = (StripeList RecipientCard)
instance StripeHasParam GetRecipientCards ExpandParams
instance StripeHasParam GetRecipientCards (EndingBefore CardId)
instance StripeHasParam GetRecipientCards Limit
instance StripeHasParam GetRecipientCards (StartingAfter CardId)