stripe-haskell-0.1.3.0: src/Web/Stripe/Subscription.hs
{-# LANGUAGE OverloadedStrings #-}
-------------------------------------------
-- |
-- Module : Web.Stripe.Subscription
-- Copyright : (c) David Johnson, 2014
-- Maintainer : djohnson.m@gmail.com
-- Stability : experimental
-- Portability : POSIX
--
-- < https:/\/\stripe.com/docs/api#subscriptions >
--
-- @
-- import Web.Stripe
-- import Web.Stripe.Subscription
-- import Web.Stripe.Customer
-- import Web.Stripe.Plan
--
-- main :: IO ()
-- main = do
-- let config = SecretKey "secret_key"
-- result <- stripe config $ do
-- Customer { customerId = cid } <- createEmptyCustomer
-- Plan { planId = pid } <- createPlan (PlanId "free plan")
-- (0 :: Amount) -- free plan
-- (USD :: Currency)
-- (Month :: Inteval)
-- ("sample plan" :: Name)
-- ([] :: MetaData)
-- createSubscription cid pid ([] :: MetaData)
-- case result of
-- Right subscription -> print subscription
-- Left stripeError -> print stripeError
-- @
module Web.Stripe.Subscription
( -- * API
createSubscription
, getSubscription
, getSubscriptionExpandable
, getSubscriptions
, getSubscriptionsExpandable
, updateSubscription
, cancelSubscription
-- * Types
, Subscription (..)
, SubscriptionId (..)
, SubscriptionStatus (..)
, CustomerId (..)
, CouponId (..)
, Coupon (..)
, PlanId (..)
, StripeList (..)
) where
import Web.Stripe.Client.Internal (Method (GET, POST, DELETE), Stripe,
StripeRequest (..), callAPI,
getParams, toExpandable,
toMetaData, toText, (</>))
import Web.Stripe.Types (CustomerId (..), EndingBefore,
ExpandParams, Limit, MetaData,
PlanId (..), StartingAfter, CouponId(..),
Subscription (..), StripeList(..),
SubscriptionId (..), Coupon(..),
SubscriptionStatus (..))
import Web.Stripe.Types.Util (getCustomerId)
------------------------------------------------------------------------------
-- | Create a `Subscription` by `CustomerId` and `PlanId`
createSubscription
:: CustomerId -- ^ The `CustomerId` upon which to create the `Subscription`
-> PlanId -- ^ The `PlanId` to associate the `Subscription` with
-> MetaData -- ^ The `MetaData` associated with the `Subscription`
-> Stripe Subscription
createSubscription
customerid
(PlanId planid)
metadata = callAPI request
where request = StripeRequest POST url params
url = "customers" </> getCustomerId customerid </> "subscriptions"
params = toMetaData metadata ++ getParams [ ("plan", Just planid) ]
------------------------------------------------------------------------------
-- | Retrieve a `Subscription` by `CustomerId` and `SubscriptionId`
getSubscription
:: CustomerId -- ^ The `CustomerId` of the `Subscription`
-> SubscriptionId -- ^ The `SubscriptionId` of the `Subscription` to retrieve
-> Stripe Subscription
getSubscription
customerid
subscriptionid =
getSubscriptionExpandable
customerid subscriptionid []
------------------------------------------------------------------------------
-- | Retrieve a `Subscription` by `CustomerId` and `SubscriptionId` with `ExpandParams`
getSubscriptionExpandable
:: CustomerId -- ^ The `CustomerId` of the `Subscription` to retrieve
-> SubscriptionId -- ^ The `SubscriptionId` of the `Subscription` to retrieve
-> ExpandParams -- ^ The `ExpandParams` of the object to expand
-> Stripe Subscription
getSubscriptionExpandable
customerid
(SubscriptionId subscriptionid)
expandParams = callAPI request
where request = StripeRequest GET url params
url = "customers" </> getCustomerId customerid </> "subscriptions" </> subscriptionid
params = toExpandable expandParams
------------------------------------------------------------------------------
-- | Retrieve active `Subscription`s
getSubscriptions
:: CustomerId -- ^ The `CustomerId` of the `Subscription`s to retrieve
-> Limit -- ^ Defaults to 10 if `Nothing` specified
-> StartingAfter SubscriptionId -- ^ Paginate starting after the following `CustomerId`
-> EndingBefore SubscriptionId -- ^ Paginate ending before the following `CustomerId`
-> Stripe (StripeList Subscription)
getSubscriptions
customerid
limit
startingAfter
endingBefore =
getSubscriptionsExpandable customerid limit
startingAfter endingBefore []
------------------------------------------------------------------------------
-- | Retrieve active `Subscription`s
getSubscriptionsExpandable
:: CustomerId -- ^ The `CustomerId` of the `Subscription`s to retrieve
-> Limit -- ^ Defaults to 10 if `Nothing` specified
-> StartingAfter SubscriptionId -- ^ Paginate starting after the following `CustomerId`
-> EndingBefore SubscriptionId -- ^ Paginate ending before the following `CustomerId`
-> ExpandParams -- ^ The `ExpandParams` of the object to expand
-> Stripe (StripeList Subscription)
getSubscriptionsExpandable
customerid
limit
startingAfter
endingBefore
expandParams = callAPI request
where request = StripeRequest GET url params
url = "customers" </> getCustomerId customerid </> "subscriptions"
params = getParams [
("limit", toText `fmap` limit )
, ("starting_after", (\(SubscriptionId x) -> x) `fmap` startingAfter)
, ("ending_before", (\(SubscriptionId x) -> x) `fmap` endingBefore)
] ++ toExpandable expandParams
------------------------------------------------------------------------------
-- | Update a `Subscription` by `CustomerId` and `SubscriptionId`
updateSubscription
:: CustomerId -- ^ The `CustomerId` of the `Subscription` to update
-> SubscriptionId -- ^ The `SubscriptionId` of the `Subscription` to update
-> Maybe CouponId -- ^ Optional: The `Coupon` of the `Subscription` to update
-> Maybe PlanId -- ^ Optional: The id `Plan` to switch the `Subscription` to
-> MetaData
-> Stripe Subscription
updateSubscription
customerid
(SubscriptionId subscriptionid)
couponid
planid
metadata = callAPI request
where request = StripeRequest POST url params
url = "customers" </> getCustomerId customerid </> "subscriptions" </> subscriptionid
params = toMetaData metadata ++ getParams [
("coupon", (\(CouponId x) -> x) `fmap` couponid)
, ("plan", (\(PlanId x) -> x) `fmap` planid)
]
------------------------------------------------------------------------------
-- | Delete a `Subscription` by `CustomerId` and `SubscriptionId`
cancelSubscription
:: CustomerId -- ^ The `CustomerId` of the `Subscription` to cancel
-> SubscriptionId -- ^ The `SubscriptionId` of the `Subscription` to cancel
-> Bool -- ^ Flag set to true will delay cancellation until end of current period, default `False`
-> Stripe Subscription
cancelSubscription
customerid
(SubscriptionId subscriptionid)
atPeriodEnd
= callAPI request
where request = StripeRequest DELETE url params
url = "customers" </> getCustomerId customerid </> "subscriptions" </> subscriptionid
params = getParams [ ("at_period_end", Just $ toText atPeriodEnd) ]