module Web.Stripe.Types where
import Control.Applicative (pure, (<$>), (<*>), (<|>))
import Control.Monad (mzero)
import Data.Aeson (FromJSON (parseJSON),
Value (String, Object, Bool), (.:),
(.:?))
import qualified Data.HashMap.Strict as H
import Data.Text (Text)
import Data.Time (UTCTime)
import Web.Stripe.Client.Internal (fromSeconds)
data ChargeId
= ChargeId Text
| ExpandedCharge Charge
deriving (Show, Eq)
instance FromJSON ChargeId where
parseJSON (String x) = pure $ ChargeId x
parseJSON o@(Object _) = ExpandedCharge <$> parseJSON o
parseJSON _ = mzero
newtype StatementDescription =
StatementDescription Text deriving (Show, Eq)
data Charge = Charge {
chargeId :: ChargeId
, chargeObject :: Text
, chargeCreated :: UTCTime
, chargeLiveMode :: Bool
, chargePaid :: Bool
, chargeAmount :: Int
, chargeCurrency :: Currency
, chargeRefunded :: Bool
, chargeCreditCard :: Card
, chargeCaptured :: Bool
, chargeRefunds :: StripeList Refund
, chargeBalanceTransaction :: Maybe TransactionId
, chargeFailureMessage :: Maybe Text
, chargeFailureCode :: Maybe Text
, chargeAmountRefunded :: Int
, chargeCustomerId :: Maybe CustomerId
, chargeInvoice :: Maybe InvoiceId
, chargeDescription :: Maybe Description
, chargeDispute :: Maybe Dispute
, chargeMetaData :: MetaData
, chargeStatementDescription :: Maybe Description
, chargeReceiptEmail :: Maybe Text
, chargeReceiptNumber :: Maybe Text
} deriving (Show, Eq)
instance FromJSON Charge where
parseJSON (Object o) =
Charge <$> (ChargeId <$> o .: "id")
<*> o .: "object"
<*> (fromSeconds <$> o .: "created")
<*> o .: "livemode"
<*> o .: "paid"
<*> o .: "amount"
<*> o .: "currency"
<*> o .: "refunded"
<*> o .: "card"
<*> o .: "captured"
<*> o .: "refunds"
<*> ((fmap TransactionId <$> o .:? "balance_transaction")
<|> (fmap ExpandedTransaction <$> o .:? "balance_transaction"))
<*> o .:? "failure_message"
<*> o .:? "failure_code"
<*> o .: "amount_refunded"
<*> ((fmap CustomerId <$> o .:? "customer")
<|> (fmap ExpandedCustomer <$> o .:? "customer"))
<*> ((fmap InvoiceId <$> o .:? "invoice")
<|> (fmap ExpandedInvoice <$> o .:? "invoice"))
<*> o .:? "description"
<*> o .:? "dispute"
<*> (H.toList <$> o .: "metadata")
<*> o .:? "statement_description"
<*> o .:? "receipt_email"
<*> o .:? "receipt_number"
parseJSON _ = mzero
type Capture = Bool
newtype RefundId =
RefundId Text deriving (Eq, Show)
data Refund = Refund {
refundId :: RefundId
, refundAmount :: Int
, refundCurrency :: Currency
, refundCreated :: UTCTime
, refundObject :: Text
, refundCharge :: ChargeId
, refundBalanceTransaction :: TransactionId
, refundMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON Refund where
parseJSON (Object o) =
Refund <$> (RefundId <$> o .: "id")
<*> o .: "amount"
<*> o .: "currency"
<*> (fromSeconds <$> o .: "created")
<*> o .: "object"
<*> (ChargeId <$> o .: "charge")
<*> ((TransactionId <$> o .: "balance_transaction")
<|> (ExpandedTransaction <$> o .: "balance_transaction"))
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data CustomerId =
CustomerId Text |
ExpandedCustomer Customer
deriving (Show, Eq)
instance FromJSON CustomerId where
parseJSON (String x) = pure (CustomerId x)
parseJSON v@(Object _) = ExpandedCustomer <$> parseJSON v
parseJSON _ = mzero
data Customer = Customer {
customerObject :: Text
, customerCreated :: UTCTime
, customerId :: CustomerId
, customerLiveMode :: Bool
, customerDescription :: Maybe Description
, customerEmail :: Maybe Email
, customerDelinquent :: Bool
, customerSubscriptions :: StripeList Subscription
, customerDiscount :: Maybe Discount
, customerAccountBalance :: Int
, customerCards :: StripeList Card
, customerCurrency :: Maybe Currency
, customerDefaultCard :: Maybe CardId
, customerMetaData :: MetaData
} | DeletedCustomer {
deletedCustomer :: Maybe Bool
, deletedCustomerId :: CustomerId
} deriving (Show, Eq)
instance FromJSON Customer where
parseJSON (Object o)
= (Customer
<$> o .: "object"
<*> (fromSeconds <$> o .: "created")
<*> (CustomerId <$> o .: "id")
<*> o .: "livemode"
<*> o .:? "description"
<*> (fmap Email <$> o .:? "email")
<*> o .: "delinquent"
<*> o .: "subscriptions"
<*> o .:? "discount"
<*> o .: "account_balance"
<*> o .: "cards"
<*> o .:? "currency"
<*> ((fmap CardId <$> o .:? "default_card")
<|> (fmap ExpandedCard <$> o .:? "default_card"))
<*> (H.toList <$> o .: "metadata")
<|> DeletedCustomer
<$> o .: "deleted"
<*> (CustomerId <$> o .: "id"))
<|> DeletedCustomer
<$> o .:? "deleted"
<*> (CustomerId <$> o .: "id")
parseJSON _ = mzero
type AccountBalance = Int
data CardId = CardId Text
| ExpandedCard Card
deriving (Eq, Show)
data RecipientCardId = RecipientCardId Text
| ExpandedRecipientCard RecipientCard
deriving (Eq, Show)
instance FromJSON CardId where
parseJSON o@(Object _) = ExpandedCard <$> parseJSON o
parseJSON (String x) = pure $ CardId x
parseJSON _ = mzero
newtype CardNumber = CardNumber Text deriving (Show, Eq)
newtype ExpMonth = ExpMonth Int deriving (Show, Eq)
newtype ExpYear = ExpYear Int deriving (Show, Eq)
newtype CVC = CVC Text deriving (Show, Eq)
newtype AddressCity = AddressCity Text deriving (Show, Eq)
newtype AddressCountry = AddressCountry Text deriving (Show, Eq)
newtype AddressLine1 = AddressLine1 Text deriving (Show, Eq)
newtype AddressLine2 = AddressLine2 Text deriving (Show, Eq)
newtype AddressState = AddressState Text deriving (Show, Eq)
newtype AddressZip = AddressZip Text deriving (Show, Eq)
data Brand = Visa
| AMEX
| MasterCard
| Discover
| JCB
| DinersClub
| Unknown
deriving (Show, Eq)
instance FromJSON Brand where
parseJSON (String "American Express") = pure AMEX
parseJSON (String "MasterCard") = pure MasterCard
parseJSON (String "Discover") = pure Discover
parseJSON (String "JCB") = pure JCB
parseJSON (String "Visa") = pure Visa
parseJSON (String "DinersClub") = pure DinersClub
parseJSON _ = mzero
data Card = Card {
cardId :: CardId
, cardObject :: Text
, cardLastFour :: Text
, cardBrand :: Brand
, cardFunding :: Text
, cardExpMonth :: ExpMonth
, cardExpYear :: ExpYear
, cardFingerprint :: Text
, cardCountry :: Text
, cardName :: Maybe Name
, cardAddressLine1 :: Maybe AddressLine1
, cardAddressLine2 :: Maybe AddressLine2
, cardAddressCity :: Maybe AddressCity
, cardAddressState :: Maybe AddressState
, cardAddressZip :: Maybe AddressZip
, cardAddressCountry :: Maybe AddressCountry
, cardCVCCheck :: Maybe Text
, cardAddressLine1Check :: Maybe Text
, cardAddressZipCheck :: Maybe Text
, cardCustomerId :: Maybe CustomerId
} deriving (Show, Eq)
data RecipientCard = RecipientCard {
recipientCardId :: RecipientCardId
, recipientCardLastFour :: Text
, recipientCardBrand :: Brand
, recipientCardFunding :: Text
, recipientCardExpMonth :: ExpMonth
, recipientCardExpYear :: ExpYear
, recipientCardFingerprint :: Text
, recipientCardCountry :: Country
, recipientCardName :: Maybe Name
, recipientCardAddressLine1 :: Maybe AddressLine1
, recipientCardAddressLine2 :: Maybe AddressLine2
, recipientCardAddressCity :: Maybe AddressCity
, recipientCardAddressState :: Maybe AddressState
, recipientCardAddressZip :: Maybe AddressZip
, recipientCardAddressCountry :: Maybe AddressCountry
, recipientCardCVCCheck :: Maybe Text
, recipientCardAddressLine1Check :: Maybe Text
, recipientCardAddressZipCheck :: Maybe Text
, recipientCardRecipientId :: Maybe RecipientId
} deriving (Show, Eq)
instance FromJSON Card where
parseJSON (Object o) =
Card <$> (CardId <$> o .: "id")
<*> o .: "object"
<*> o .: "last4"
<*> o .: "brand"
<*> o .: "funding"
<*> (ExpMonth <$> o .: "exp_month")
<*> (ExpYear <$> o .: "exp_year")
<*> o .: "fingerprint"
<*> o .: "country"
<*> o .:? "name"
<*> (fmap AddressLine1 <$> o .:? "address_line1")
<*> (fmap AddressLine2 <$> o .:? "address_line2")
<*> (fmap AddressCity <$> o .:? "address_city")
<*> (fmap AddressState <$> o .:? "address_state")
<*> (fmap AddressZip <$> o .:? "address_zip")
<*> (fmap AddressCountry <$> o .:? "address_country")
<*> o .:? "cvc_check"
<*> o .:? "address_line1_check"
<*> o .:? "address_zip_check"
<*> ((fmap CustomerId <$> o .:? "customer")
<|> (fmap ExpandedCustomer <$> o .:? "customer"))
parseJSON _ = mzero
instance FromJSON RecipientCard where
parseJSON (Object o) =
RecipientCard
<$> (RecipientCardId <$> o .: "id")
<*> o .: "last4"
<*> o .: "brand"
<*> o .: "funding"
<*> (ExpMonth <$> o .: "exp_month")
<*> (ExpYear <$> o .: "exp_year")
<*> o .: "fingerprint"
<*> (Country <$> o .: "country")
<*> o .:? "name"
<*> (fmap AddressLine1 <$> o .:? "address_line1")
<*> (fmap AddressLine2 <$> o .:? "address_line2")
<*> (fmap AddressCity <$> o .:? "address_city")
<*> (fmap AddressState <$> o .:? "address_state")
<*> (fmap AddressZip <$> o .:? "address_zip")
<*> (fmap AddressCountry <$> o .:? "address_country")
<*> o .:? "cvc_check"
<*> o .:? "address_line1_check"
<*> o .:? "address_zip_check"
<*> ((fmap RecipientId <$> o .:? "recipient")
<|> (fmap ExpandedRecipient <$> o .:? "recipient"))
parseJSON _ = mzero
newtype SubscriptionId =
SubscriptionId Text
deriving (Show, Eq)
data Subscription = Subscription {
subscriptionId :: SubscriptionId
, subscriptionPlan :: Plan
, subscriptionObject :: Text
, subscriptionStart :: UTCTime
, subscriptionStatus :: SubscriptionStatus
, subscriptionCustomerId :: CustomerId
, subscriptionCancelAtPeriodEnd :: Bool
, subscriptionCurrentPeriodStart :: UTCTime
, subscriptionCurrentPeriodEnd :: UTCTime
, subscriptionEndedAt :: Maybe UTCTime
, subscriptionTrialStart :: Maybe UTCTime
, subscriptionTrialEnd :: Maybe UTCTime
, subscriptionCanceledAt :: Maybe UTCTime
, subscriptionQuantity :: Quantity
, subscriptionApplicationFeePercent :: Maybe Double
, subscriptionDiscount :: Maybe Discount
, subscriptionMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON Subscription where
parseJSON (Object o) =
Subscription <$> (SubscriptionId <$> o .: "id")
<*> o .: "plan"
<*> o .: "object"
<*> (fromSeconds <$> o .: "start")
<*> o .: "status"
<*> ((CustomerId <$> o .: "customer")
<|> (ExpandedCustomer <$> o .: "customer"))
<*> o .: "cancel_at_period_end"
<*> (fromSeconds <$> o .: "current_period_start")
<*> (fromSeconds <$> o .: "current_period_end")
<*> (fmap fromSeconds <$> o .:? "ended_at")
<*> (fmap fromSeconds <$> o .:? "trial_start")
<*> (fmap fromSeconds <$> o .:? "trial_end")
<*> (fmap fromSeconds <$> o .:? "canceled_at")
<*> (Quantity <$> o .: "quantity")
<*> o .:? "application_fee_percent"
<*> o .:? "discount"
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data SubscriptionStatus =
Trialing
| Active
| PastDue
| Canceled
| UnPaid
deriving (Show, Eq)
instance FromJSON SubscriptionStatus where
parseJSON (String "trialing") = pure Trialing
parseJSON (String "active") = pure Active
parseJSON (String "past_due") = pure PastDue
parseJSON (String "canceled") = pure Canceled
parseJSON (String "unpaid") = pure UnPaid
parseJSON _ = mzero
newtype PlanId = PlanId Text deriving (Show, Eq)
data Plan = Plan {
planInterval :: Interval
, planName :: Text
, planCreated :: UTCTime
, planAmount :: Int
, planCurrency :: Currency
, planId :: PlanId
, planObject :: Text
, planLiveMode :: Bool
, planIntervalCount :: Maybe Int
, planTrialPeriodDays :: Maybe Int
, planMetaData :: MetaData
, planDescription :: Maybe Description
} deriving (Show, Eq)
instance FromJSON Plan where
parseJSON (Object o) =
Plan <$> o .: "interval"
<*> o .: "name"
<*> (fromSeconds <$> o .: "created")
<*> o .: "amount"
<*> o .: "currency"
<*> (PlanId <$> o .: "id")
<*> o .: "object"
<*> o .: "livemode"
<*> o .:? "interval_count"
<*> o .:? "trial_period_days"
<*> (H.toList <$> o .: "metadata")
<*> o .:? "statement_description"
parseJSON _ = mzero
type TrialPeriod = UTCTime
data Interval = Day | Week | Month | Year deriving Eq
instance FromJSON Interval where
parseJSON (String "day") = pure Day
parseJSON (String "week") = pure Week
parseJSON (String "month") = pure Month
parseJSON (String "year") = pure Year
parseJSON _ = mzero
instance Show Interval where
show Day = "day"
show Week = "week"
show Month = "month"
show Year = "year"
data Duration = Forever | Once | Repeating deriving Eq
instance Show Duration where
show Forever = "forever"
show Once = "once"
show Repeating = "repeating"
instance FromJSON Duration where
parseJSON (String x)
| x == "forever" = pure Forever
| x == "once" = pure Once
| x == "repeating" = pure Repeating
parseJSON _ = mzero
data Coupon = Coupon {
couponId :: CouponId
, couponCreated :: UTCTime
, couponPercentOff :: Maybe Int
, couponAmountOff :: Maybe Int
, couponCurrency :: Maybe Currency
, couponLiveMode :: Bool
, couponDuration :: Duration
, couponRedeemBy :: Maybe UTCTime
, couponMaxRedemptions :: Maybe Int
, couponTimesRedeemed :: Maybe Int
, couponDurationInMonths :: Maybe Int
, couponValid :: Bool
, couponMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON Coupon where
parseJSON (Object o) =
Coupon <$> (CouponId <$> o .: "id")
<*> (fromSeconds <$> o .: "created")
<*> o .: "percent_off"
<*> o .:? "amount_off"
<*> o .:? "currency"
<*> o .: "livemode"
<*> o .: "duration"
<*> (fmap fromSeconds <$> o .:? "redeem_by")
<*> o .:? "max_redemptions"
<*> o .:? "times_redeemed"
<*> o .:? "duration_in_months"
<*> o .: "valid"
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
newtype CouponId = CouponId Text deriving (Show, Eq)
newtype AmountOff = AmountOff Int deriving (Show, Eq)
newtype MaxRedemptions = MaxRedemptions Int deriving (Show, Eq)
newtype PercentOff = PercentOff Int deriving (Show, Eq)
newtype RedeemBy = RedeemBy UTCTime deriving (Show, Eq)
newtype DurationInMonths = DurationInMonths Int deriving (Show, Eq)
newtype IntervalCount = IntervalCount Int deriving (Show, Eq)
newtype TrialPeriodDays = TrialPeriodDays Int deriving (Show, Eq)
type Amount = Int
data Discount = Discount {
discountCoupon :: Coupon
, discountStart :: UTCTime
, discountEnd :: Maybe UTCTime
, discountCustomer :: CustomerId
, discountObject :: Text
, discountSubscription :: Maybe SubscriptionId
} deriving (Show, Eq)
instance FromJSON Discount where
parseJSON (Object o) =
Discount <$> o .: "coupon"
<*> (fromSeconds <$> o .: "start")
<*> (fmap fromSeconds <$> o .:? "end")
<*> ((CustomerId <$> o .: "customer")
<|> (ExpandedCustomer <$> o .: "customer"))
<*> o .: "object"
<*> (fmap SubscriptionId <$> o .:? "subscription")
parseJSON _ = mzero
data InvoiceId =
InvoiceId Text
| ExpandedInvoice Invoice
deriving (Show, Eq)
instance FromJSON InvoiceId where
parseJSON (String x) = pure $ InvoiceId x
parseJSON o@(Object _) = ExpandedInvoice <$> parseJSON o
parseJSON _ = mzero
data Invoice = Invoice {
invoiceDate :: UTCTime
, invoiceId :: Maybe InvoiceId
, invoicePeriodStart :: UTCTime
, invoicePeriodEnd :: UTCTime
, invoiceLineItems :: StripeList InvoiceLineItem
, invoiceSubTotal :: Int
, invoiceTotal :: Int
, invoiceCustomer :: CustomerId
, invoiceObject :: Text
, invoiceAttempted :: Bool
, invoiceClosed :: Bool
, invoiceForgiven :: Bool
, invoicePaid :: Bool
, invoiceLiveMode :: Bool
, invoiceAttemptCount :: Int
, invoiceAmountDue :: Int
, invoiceCurrency :: Currency
, invoiceStartingBalance :: Int
, invoiceEndingBalance :: Maybe Int
, invoiceNextPaymentAttempt :: Maybe UTCTime
, invoiceWebHooksDeliveredAt :: Maybe UTCTime
, invoiceCharge :: Maybe ChargeId
, invoiceDiscount :: Maybe Discount
, invoiceApplicateFee :: Maybe FeeId
, invoiceSubscription :: Maybe SubscriptionId
, invoiceStatementDescription :: Maybe Description
, invoiceDescription :: Maybe Description
, invoiceMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON Invoice where
parseJSON (Object o) =
Invoice <$> (fromSeconds <$> o .: "date")
<*> (fmap InvoiceId <$> o .:? "id")
<*> (fromSeconds <$> o .: "period_start")
<*> (fromSeconds <$> o .: "period_end")
<*> o .: "lines"
<*> o .: "subtotal"
<*> o .: "total"
<*> ((CustomerId <$> o .: "customer")
<|> (ExpandedCustomer <$> o .: "customer"))
<*> o .: "object"
<*> o .: "attempted"
<*> o .: "closed"
<*> o .: "forgiven"
<*> o .: "paid"
<*> o .: "livemode"
<*> o .: "attempt_count"
<*> o .: "amount_due"
<*> o .: "currency"
<*> o .: "starting_balance"
<*> o .:? "ending_balance"
<*> (fmap fromSeconds <$> o .:? "next_payment_attempt")
<*> (fmap fromSeconds <$> o .: "webhooks_delivered_at")
<*> ((fmap ChargeId <$> o .:? "charge")
<|> (fmap ExpandedCharge <$> o .:? "charge"))
<*> o .:? "discount"
<*> (fmap FeeId <$> o .:? "application_fee")
<*> (fmap SubscriptionId <$> o .: "subscription")
<*> o .:? "statement_description"
<*> o .:? "description"
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data InvoiceItemId
= InvoiceItemId Text
| ExpandedInvoiceItem InvoiceItem
deriving (Eq, Show)
data InvoiceItem = InvoiceItem {
invoiceItemObject :: Text
, invoiceItemId :: InvoiceItemId
, invoiceItemDate :: UTCTime
, invoiceItemAmount :: Int
, invoiceItemLiveMode :: Bool
, invoiceItemProration :: Bool
, invoiceItemCurrency :: Currency
, invoiceItemCustomer :: CustomerId
, invoiceItemDescription :: Maybe Description
, invoiceItemInvoice :: Maybe InvoiceId
, invoiceItemQuantity :: Maybe Quantity
, invoiceItemSubscription :: Maybe Subscription
, invoiceItemMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON InvoiceItem where
parseJSON (Object o) =
InvoiceItem <$> o .: "object"
<*> (InvoiceItemId <$> o .: "id")
<*> (fromSeconds <$> o .: "date")
<*> o .: "amount"
<*> o .: "livemode"
<*> o .: "proration"
<*> o .: "currency"
<*> ((CustomerId <$> o .: "customer")
<|> (ExpandedCustomer <$> o .: "customer"))
<*> o .:? "description"
<*> ((fmap InvoiceId <$> o .:? "invoice")
<|> (fmap ExpandedInvoice <$> o .:? "invoice"))
<*> (fmap Quantity <$> o .:? "quantity")
<*> o .:? "subscription"
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
newtype InvoiceLineItemId =
InvoiceLineItemId Text deriving (Show, Eq)
data InvoiceLineItemType
= InvoiceItemType |
SubscriptionItemType
deriving (Show,Eq)
instance FromJSON InvoiceLineItemType where
parseJSON (String "invoiceitem") = pure InvoiceItemType
parseJSON (String "subscription") = pure SubscriptionItemType
parseJSON _ = mzero
data InvoiceLineItem = InvoiceLineItem {
invoiceLineItemId :: InvoiceLineItemId
, invoiceLineItemObject :: Text
, invoiceLineItemType :: InvoiceLineItemType
, invoiceLineItemLiveMode :: Bool
, invoiceLineItemAmount :: Int
, invoiceLineItemCurrency :: Currency
, invoiceLineItemProration :: Bool
, invoiceLineItemPeriod :: Period
, invoiceLineItemQuantity :: Maybe Quantity
, invoiceLineItemPlan :: Maybe Plan
, invoiceLineItemDescription :: Maybe Description
, invoiceLineItemMetaData :: MetaData
} deriving (Show, Eq)
data Period = Period {
start :: UTCTime
, end :: UTCTime
} deriving (Show, Eq)
instance FromJSON Period where
parseJSON (Object o) =
Period <$> (fromSeconds <$> o .: "start")
<*> (fromSeconds <$> o .: "end")
parseJSON _ = mzero
instance FromJSON InvoiceLineItem where
parseJSON (Object o) =
InvoiceLineItem <$> (InvoiceLineItemId <$> o .: "id")
<*> o .: "object"
<*> o .: "type"
<*> o .: "livemode"
<*> o .: "amount"
<*> o .: "currency"
<*> o .: "proration"
<*> o .: "period"
<*> (fmap Quantity <$> o .:? "quantity")
<*> o .:? "plan"
<*> o .:? "description"
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data DisputeStatus
= WarningNeedsResponse
| WarningUnderReview
| NeedsResponse
| UnderReview
| ChargeRefunded
| Won
| Lost
deriving (Show, Eq)
instance FromJSON DisputeReason where
parseJSON (String "duplicate") = pure Duplicate
parseJSON (String "fraudulent") = pure Fraudulent
parseJSON (String "subscription_canceled") = pure SubscriptionCanceled
parseJSON (String "product_unacceptable") = pure ProductUnacceptable
parseJSON (String "product_not_received") = pure ProductNotReceived
parseJSON (String "credit_not_processed") = pure CreditNotProcessed
parseJSON (String "general") = pure General
parseJSON _ = mzero
data DisputeReason
= Duplicate
| Fraudulent
| SubscriptionCanceled
| ProductUnacceptable
| ProductNotReceived
| Unrecognized
| CreditNotProcessed
| General
deriving (Show, Eq)
instance FromJSON DisputeStatus where
parseJSON (String "needs_response") = pure NeedsResponse
parseJSON (String "warning_needs_response") = pure WarningNeedsResponse
parseJSON (String "warning_under_review") = pure WarningUnderReview
parseJSON (String "under_review") = pure UnderReview
parseJSON (String "charge_refunded") = pure ChargeRefunded
parseJSON (String "won") = pure Won
parseJSON (String "lost") = pure Lost
parseJSON _ = mzero
data Dispute = Dispute {
disputeChargeId :: ChargeId
, disputeAmount :: Int
, disputeCreated :: UTCTime
, disputeStatus :: DisputeStatus
, disputeLiveMode :: Bool
, disputeCurrency :: Currency
, disputeObject :: Text
, disputeReason :: DisputeReason
, disputeIsChargeRefundable :: Bool
, disputeBalanceTransactions :: [BalanceTransaction]
, disputeEvidenceDueBy :: UTCTime
, disputeEvidence :: Maybe Evidence
, disputeMetaData :: MetaData
} deriving (Show, Eq)
newtype Evidence = Evidence Text deriving (Show, Eq)
instance FromJSON Dispute where
parseJSON (Object o) =
Dispute <$> ((ChargeId <$> o .: "charge")
<|> (ExpandedCharge <$> o .: "charge"))
<*> o .: "amount"
<*> (fromSeconds <$> o .: "created")
<*> o .: "status"
<*> o .: "livemode"
<*> o .: "currency"
<*> o .: "object"
<*> o .: "reason"
<*> o .: "is_charge_refundable"
<*> o .: "balance_transactions"
<*> (fromSeconds <$> o .: "evidence_due_by")
<*> (fmap Evidence <$> o .:? "evidence")
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
newtype TransferId =
TransferId Text deriving (Show, Eq)
data TransferStatus =
TransferPaid
| TransferPending
| TransferCanceled
| TransferFailed
deriving (Show, Eq)
data TransferType =
CardTransfer
| BankAccountTransfer
deriving (Show, Eq)
instance FromJSON TransferType where
parseJSON (String "card") = pure CardTransfer
parseJSON (String "bank_account") = pure BankAccountTransfer
parseJSON _ = mzero
instance FromJSON TransferStatus where
parseJSON (String "paid") = pure TransferPaid
parseJSON (String "pending") = pure TransferPending
parseJSON (String "canceled") = pure TransferCanceled
parseJSON _ = mzero
data Transfer = Transfer {
transferId :: TransferId
, transferObject :: Text
, transferCreated :: UTCTime
, transferDate :: UTCTime
, transferLiveMode :: Bool
, transferAmount :: Int
, transferCurrency :: Currency
, transferStatus :: TransferStatus
, transferType :: TransferType
, transferBalanceTransaction :: TransactionId
, transferDescription :: Maybe Description
, transferBankAccount :: Maybe BankAccount
, transferFailureMessage :: Maybe Text
, transferFailureCode :: Maybe Text
, transferStatementDescription :: Maybe Description
, transferRecipient :: Maybe RecipientId
, transferMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON Transfer where
parseJSON (Object o) =
Transfer <$> (TransferId <$> o .: "id")
<*> o .: "object"
<*> (fromSeconds <$> o .: "created")
<*> (fromSeconds <$> o .: "date")
<*> o .: "livemode"
<*> o .: "amount"
<*> o .: "currency"
<*> o .: "status"
<*> o .: "type"
<*> ((TransactionId <$> o .: "balance_transaction")
<|> (ExpandedTransaction <$> o .: "balance_transaction"))
<*> o .:? "description"
<*> o .:? "bank_account"
<*> o .:? "failure_message"
<*> o .:? "failure_code"
<*> o .:? "statement_description"
<*> ((fmap RecipientId <$> o .:? "recipient")
<|> (fmap ExpandedRecipient <$> o .:? "recipient"))
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data BankAccount = BankAccount {
bankAccountId :: BankAccountId
, bankAccountObject :: Text
, bankAccountLast4 :: Text
, bankAccountCountry :: Country
, bankAccountCurrency :: Currency
, bankAccountStatus :: Maybe BankAccountStatus
, bankAccountFingerprint :: Maybe Text
, bankAccountName :: Text
} deriving (Show, Eq)
instance FromJSON BankAccount where
parseJSON (Object o) =
BankAccount <$> (BankAccountId <$> o .: "id")
<*> o .: "object"
<*> o .: "last4"
<*> (Country <$> o .: "country")
<*> o .: "currency"
<*> o .:? "status"
<*> o .:? "fingerprint"
<*> o .: "bank_name"
parseJSON _ = mzero
newtype BankAccountId = BankAccountId Text
deriving (Show, Eq)
data BankAccountStatus =
New | Validated | Verified | Errored
deriving (Show, Eq)
instance FromJSON BankAccountStatus where
parseJSON (String "new") = pure $ New
parseJSON (String "validated") = pure Validated
parseJSON (String "verified") = pure Verified
parseJSON (String "errored") = pure Errored
parseJSON _ = mzero
newtype RoutingNumber =
RoutingNumber Text deriving (Show, Eq)
newtype Country =
Country Text deriving (Show, Eq)
newtype AccountNumber =
AccountNumber Text deriving (Show, Eq)
newtype FirstName = FirstName Text deriving (Show, Eq)
newtype LastName = LastName Text deriving (Show, Eq)
type MiddleInitial = Char
data RecipientId =
RecipientId Text
| ExpandedRecipient Recipient
deriving (Show, Eq)
instance FromJSON RecipientId where
parseJSON (String x) = pure $ RecipientId x
parseJSON o@(Object _) = ExpandedRecipient <$> parseJSON o
parseJSON _ = mzero
type TaxID = Text
data RecipientType =
Individual
| Corporation deriving Eq
instance Show RecipientType where
show Individual = "individual"
show Corporation = "corporation"
instance FromJSON RecipientType where
parseJSON (String "individual") = pure Individual
parseJSON (String "corporation") = pure Corporation
parseJSON _ = mzero
data Recipient = Recipient {
recipientId :: RecipientId
, recipientObject :: Text
, recipientCreated :: UTCTime
, recipientLiveMode :: Bool
, recipientType :: RecipientType
, recipientDescription :: Maybe Description
, recipientEmail :: Maybe Email
, recipientName :: Name
, recipientVerified :: Bool
, recipientActiveAccount :: Maybe BankAccount
, recipientCards :: StripeList RecipientCard
, recipientDefaultCard :: Maybe RecipientCardId
} | DeletedRecipient {
deletedRecipient :: Maybe Bool
, deletedRecipientId :: RecipientId
} deriving (Show, Eq)
instance FromJSON Recipient where
parseJSON (Object o) =
(Recipient <$> (RecipientId <$> o .: "id")
<*> o .: "object"
<*> (fromSeconds <$> o .: "created")
<*> o .: "livemode"
<*> o .: "type"
<*> o .:? "description"
<*> (fmap Email <$> o .:? "email")
<*> o .: "name"
<*> o .: "verified"
<*> o .:? "active_account"
<*> o .: "cards"
<*> ((fmap RecipientCardId <$> o .:? "default_card")
<|> (fmap ExpandedRecipientCard <$> o .:? "default_card")))
<|> DeletedRecipient
<$> o .:? "deleted"
<*> (RecipientId <$> o .: "id")
parseJSON _ = mzero
data ApplicationFee = ApplicationFee {
applicationFeeId :: Text
, applicationFeeObjecet :: Text
, applicationFeeCreated :: UTCTime
, applicationFeeLiveMode :: Bool
, applicationFeeAmount :: Int
, applicationFeeCurrency :: Currency
, applicationFeeRefunded :: Bool
, applicationFeeAmountRefunded :: Int
, applicationFeeRefunds :: StripeList Refund
, applicationFeeBalanceTransaction :: TransactionId
, applicationFeeAccountId :: AccountId
, applicationFeeApplicationId :: ApplicationId
, applicationFeeChargeId :: ChargeId
, applicationFeeMetaData :: MetaData
} deriving (Show, Eq)
newtype ApplicationId =
ApplicationId Text deriving (Show, Eq)
instance FromJSON ApplicationFee where
parseJSON (Object o) =
ApplicationFee <$> o .: "id"
<*> o .: "object"
<*> (fromSeconds <$> o .: "created")
<*> o .: "livemode"
<*> o .: "amount"
<*> o .: "currency"
<*> o .: "refunded"
<*> o .: "amount_refunded"
<*> o .: "refunds"
<*> ((TransactionId <$> o .: "balance_transaction")
<|> (ExpandedTransaction <$> o .: "balance_transaction"))
<*> ((AccountId <$> o .: "account")
<|> (ExpandedAccount <$> o .: "account"))
<*> (ApplicationId <$> o .: "application")
<*> ((ChargeId <$> o .: "charge")
<|> (ExpandedCharge <$> o .: "charge"))
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
newtype FeeId =
FeeId Text
deriving (Show, Eq)
data ApplicationFeeRefund = ApplicationFeeRefund {
applicationFeeRefundId :: RefundId
, applicationFeeRefundAmount :: Int
, applicationFeeRefundCurrency :: Currency
, applicationFeeRefundCreated :: UTCTime
, applicationFeeRefundObject :: Text
, applicationFeeRefundBalanceTransaction :: Maybe TransactionId
, applicationFeeRefundFee :: FeeId
, applicationFeeRefundMetaData :: MetaData
} deriving (Show, Eq)
instance FromJSON ApplicationFeeRefund where
parseJSON (Object o) = ApplicationFeeRefund
<$> (RefundId <$> o .: "id")
<*> o .: "amount"
<*> o .: "currency"
<*> (fromSeconds <$> o .: "created")
<*> o .: "object"
<*> ((fmap TransactionId <$> o .:? "balance_transaction")
<|> (fmap ExpandedTransaction <$> o .:? "balance_transaction"))
<*> (FeeId <$> o .: "fee")
<*> (H.toList <$> o .: "metadata")
parseJSON _ = mzero
data AccountId
= AccountId Text
| ExpandedAccount Account
deriving (Show, Eq)
instance FromJSON AccountId where
parseJSON o@(Object _) = ExpandedAccount <$> parseJSON o
parseJSON (String aid) = pure $ AccountId aid
parseJSON _ = mzero
data Account = Account {
accountId :: AccountId
, accountEmail :: Email
, accountStatementDescriptor :: Maybe Description
, accountDisplayName :: Maybe Text
, accountTimeZone :: Text
, accountDetailsSubmitted :: Bool
, accountChargeEnabled :: Bool
, accountTransferEnabled :: Bool
, accountCurrenciesSupported :: [Currency]
, accountDefaultCurrency :: Currency
, accountCountry :: Text
, accountObject :: Text
, accountBusinessName :: Maybe Text
, accountBusinessURL :: Maybe Text
, accountBusinessLogo :: Maybe Text
, accountSupportPhone :: Maybe Text
} deriving (Show, Eq)
instance FromJSON Account where
parseJSON (Object o) =
Account <$> (AccountId <$> o .: "id")
<*> (Email <$> o .: "email")
<*> o .:? "statement_descriptor"
<*> o .: "display_name"
<*> o .: "timezone"
<*> o .: "details_submitted"
<*> o .: "charge_enabled"
<*> o .: "transfer_enabled"
<*> o .: "currencies_supported"
<*> o .: "default_currency"
<*> o .: "country"
<*> o .: "object"
<*> o .:? "business_name"
<*> o .:? "business_url"
<*> o .:? "business_logo"
<*> o .:? "support_phone"
parseJSON _ = mzero
data Balance = Balance {
balancePending :: [BalanceAmount]
, balanceAvailable :: [BalanceAmount]
, balanceLiveMode :: Bool
, balanceObject :: Text
} deriving (Show, Eq)
instance FromJSON Balance where
parseJSON (Object o) =
Balance <$> o .: "pending"
<*> o .: "available"
<*> o .: "livemode"
<*> o .: "object"
parseJSON _ = mzero
data BalanceAmount = BalanceAmount {
balanceAmount :: Int
, balanceCurrency :: Currency
} deriving (Show, Eq)
instance FromJSON BalanceAmount where
parseJSON (Object o) =
BalanceAmount <$> o .: "amount"
<*> o .: "currency"
parseJSON _ = mzero
data BalanceTransaction = BalanceTransaction {
balanceTransactionId :: TransactionId
, balanceTransactionObject :: Text
, balanceTransactionAmount :: Amount
, balanceTransactionCurrency :: Currency
, balanceTransactionNet :: Int
, balanceTransactionType :: Text
, balanceTransactionCreated :: UTCTime
, balanceTransactionAvailableOn :: UTCTime
, balanceTransactionStatus :: Text
, balanceTransactionFee :: Int
, balanceTransactionFeeDetails :: [FeeDetails]
, balanceTransactionFeeSource :: ChargeId
, balanceTransactionFeeDescription :: Maybe Description
} deriving (Show, Eq)
instance FromJSON BalanceTransaction where
parseJSON (Object o) =
BalanceTransaction <$> (TransactionId <$> o .: "id")
<*> o .: "object"
<*> o .: "amount"
<*> o .: "currency"
<*> o .: "net"
<*> o .: "type"
<*> (fromSeconds <$> o .: "created")
<*> (fromSeconds <$> o .: "available_on")
<*> o .: "status"
<*> o .: "fee"
<*> o .: "fee_details"
<*> ((ChargeId <$> o .: "source")
<|> (ExpandedCharge <$> o .: "source"))
<*> o .:? "description"
parseJSON _ = mzero
data TransactionId = TransactionId Text
| ExpandedTransaction BalanceTransaction
deriving (Show, Eq)
instance FromJSON TransactionId where
parseJSON (String x) = pure (TransactionId x)
parseJSON v@(Object _) = ExpandedTransaction <$> parseJSON v
parseJSON _ = mzero
data FeeDetails = FeeDetails {
feeDetailsAmount :: Int
, feeDetailsCurrency :: Currency
, feeType :: Text
, feeDescription :: Maybe Description
, feeApplication :: Maybe Text
} deriving (Show, Eq)
instance FromJSON FeeDetails where
parseJSON (Object o) =
FeeDetails <$> o .: "amount"
<*> o .: "currency"
<*> o .: "type"
<*> o .: "description"
<*> o .:? "application"
parseJSON _ = mzero
data EventType =
AccountUpdatedEvent
| AccountApplicationDeauthorizedEvent
| ApplicationFeeCreatedEvent
| ApplicationFeeRefundedEvent
| BalanceAvailableEvent
| ChargeSucceededEvent
| ChargeFailedEvent
| ChargeRefundedEvent
| ChargeCapturedEvent
| ChargeUpdatedEvent
| ChargeDisputeCreatedEvent
| ChargeDisputeUpdatedEvent
| ChargeDisputeClosedEvent
| ChargeDisputeFundsWithdrawnEvent
| ChargeDisputeFundsReinstatedEvent
| CustomerCreatedEvent
| CustomerUpdatedEvent
| CustomerDeletedEvent
| CustomerCardCreatedEvent
| CustomerCardUpdatedEvent
| CustomerCardDeletedEvent
| CustomerSubscriptionCreatedEvent
| CustomerSubscriptionUpdatedEvent
| CustomerSubscriptionDeletedEvent
| CustomerSubscriptionTrialWillEndEvent
| CustomerDiscountCreatedEvent
| CustomerDiscountUpdatedEvent
| CustomerDiscountDeletedEvent
| InvoiceCreatedEvent
| InvoiceUpdatedEvent
| InvoicePaymentSucceededEvent
| InvoicePaymentFailedEvent
| InvoiceItemCreatedEvent
| InvoiceItemUpdatedEvent
| InvoiceItemDeletedEvent
| PlanCreatedEvent
| PlanUpdatedEvent
| PlanDeletedEvent
| CouponCreatedEvent
| CouponUpdatedEvent
| CouponDeletedEvent
| RecipientCreatedEvent
| RecipientUpdatedEvent
| RecipientDeletedEvent
| TransferCreatedEvent
| TransferUpdatedEvent
| TransferCanceledEvent
| TransferPaidEvent
| TransferFailedEvent
| PingEvent
| UnknownEvent
deriving (Show, Eq)
instance FromJSON EventType where
parseJSON (String "account.updated") = pure AccountUpdatedEvent
parseJSON (String "account.application.deauthorized") = pure AccountApplicationDeauthorizedEvent
parseJSON (String "application_fee.created") = pure ApplicationFeeCreatedEvent
parseJSON (String "application_fee.refunded") = pure ApplicationFeeRefundedEvent
parseJSON (String "balance.available") = pure BalanceAvailableEvent
parseJSON (String "charge.succeeded") = pure ChargeSucceededEvent
parseJSON (String "chage.failed") = pure ChargeFailedEvent
parseJSON (String "charge.refunded") = pure ChargeRefundedEvent
parseJSON (String "charge.captured") = pure ChargeCapturedEvent
parseJSON (String "charge.updated") = pure ChargeUpdatedEvent
parseJSON (String "charge.dispute.created") = pure ChargeDisputeCreatedEvent
parseJSON (String "charge.dispute.updated") = pure ChargeDisputeUpdatedEvent
parseJSON (String "charge.dispute.closed") = pure ChargeDisputeClosedEvent
parseJSON (String "charge.dispute.funds_withdrawn") = pure ChargeDisputeFundsWithdrawnEvent
parseJSON (String "charge.dispute.funds_reinstated") = pure ChargeDisputeFundsReinstatedEvent
parseJSON (String "customer.created") = pure CustomerCreatedEvent
parseJSON (String "customer.updated") = pure CustomerUpdatedEvent
parseJSON (String "customer.deleted") = pure CustomerDeletedEvent
parseJSON (String "customer.card.created") = pure CustomerCardCreatedEvent
parseJSON (String "customer.card.updated") = pure CustomerCardUpdatedEvent
parseJSON (String "customer.card.deleted") = pure CustomerCardDeletedEvent
parseJSON (String "customer.subscription.created") = pure CustomerSubscriptionCreatedEvent
parseJSON (String "customer.subscription.updated") = pure CustomerSubscriptionUpdatedEvent
parseJSON (String "customer.subscription.deleted") = pure CustomerSubscriptionDeletedEvent
parseJSON (String "customer.subscription.trial_will_end") = pure CustomerSubscriptionTrialWillEndEvent
parseJSON (String "customer.discount.created") = pure CustomerDiscountCreatedEvent
parseJSON (String "customer.discount.updated") = pure CustomerDiscountUpdatedEvent
parseJSON (String "invoice.created") = pure InvoiceCreatedEvent
parseJSON (String "invoice.updated") = pure InvoiceUpdatedEvent
parseJSON (String "invoice.payment_succeeded") = pure InvoicePaymentSucceededEvent
parseJSON (String "invoice.payment_failed") = pure InvoicePaymentFailedEvent
parseJSON (String "invoiceitem.created") = pure InvoiceItemCreatedEvent
parseJSON (String "invoiceitem.updated") = pure InvoiceItemUpdatedEvent
parseJSON (String "invoiceitem.deleted") = pure InvoiceItemDeletedEvent
parseJSON (String "plan.created") = pure PlanCreatedEvent
parseJSON (String "plan.updated") = pure PlanUpdatedEvent
parseJSON (String "plan.deleted") = pure PlanDeletedEvent
parseJSON (String "coupon.created") = pure CouponCreatedEvent
parseJSON (String "coupon.updated") = pure CouponUpdatedEvent
parseJSON (String "coupon.deleted") = pure CouponDeletedEvent
parseJSON (String "recipient.created") = pure RecipientCreatedEvent
parseJSON (String "recipient.updated") = pure RecipientUpdatedEvent
parseJSON (String "recipient.deleted") = pure RecipientDeletedEvent
parseJSON (String "transfer.created") = pure TransferCreatedEvent
parseJSON (String "transfer.updated") = pure TransferUpdatedEvent
parseJSON (String "transfer.canceled") = pure TransferCanceledEvent
parseJSON (String "transfer.paid") = pure TransferPaidEvent
parseJSON (String "transfer.failed") = pure TransferFailedEvent
parseJSON (String "ping") = pure PingEvent
parseJSON _ = pure UnknownEvent
newtype EventId = EventId Text deriving (Show, Eq)
data EventData =
TransferEvent Transfer
| AccountEvent Account
| AccountApplicationEvent ConnectApp
| ApplicationFeeEvent ApplicationFee
| InvoiceEvent Invoice
| PlanEvent Plan
| RecipientEvent Recipient
| CouponEvent Coupon
| BalanceEvent Balance
| ChargeEvent Charge
| DisputeEvent Dispute
| CustomerEvent Customer
| CardEvent Card
| SubscriptionEvent Subscription
| DiscountEvent Discount
| InvoiceItemEvent InvoiceItem
| UnknownEventData
| Ping
deriving (Show, Eq)
data Event = Event {
eventId :: Maybe EventId
, eventCreated :: UTCTime
, eventLiveMode :: Bool
, eventType :: EventType
, eventData :: EventData
, eventObject :: Text
, eventPendingWebHooks :: Int
, eventRequest :: Maybe Text
} deriving (Show, Eq)
instance FromJSON Event where
parseJSON (Object o) = do
eventId <- fmap EventId <$> o .:? "id"
eventCreated <- fromSeconds <$> o .: "created"
eventLiveMode <- o .: "livemode"
eventType <- o .: "type"
String etype <- o .: "type"
obj <- o .: "data"
eventData <-
case etype of
"account.updated" -> AccountEvent <$> obj .: "object"
"account.application.deauthorized" -> AccountApplicationEvent <$> obj .: "object"
"application_fee.created" -> ApplicationFeeEvent <$> obj .: "object"
"application_fee.refunded" -> ApplicationFeeEvent <$> obj .: "object"
"balance.available" -> BalanceEvent <$> obj .: "object"
"charge.succeeded" -> ChargeEvent <$> obj .: "object"
"charge.failed" -> ChargeEvent <$> obj .: "object"
"charge.refunded" -> ChargeEvent <$> obj .: "object"
"charge.captured" -> ChargeEvent <$> obj .: "object"
"charge.updated" -> ChargeEvent <$> obj .: "object"
"charge.dispute.created" -> DisputeEvent <$> obj .: "object"
"charge.dispute.updated" -> DisputeEvent <$> obj .: "object"
"charge.dispute.closed" -> DisputeEvent <$> obj .: "object"
"charge.dispute.funds_withdrawn" -> DisputeEvent <$> obj .: "object"
"charge.dispute.funds_reinstated" -> DisputeEvent <$> obj .: "object"
"customer.created" -> CustomerEvent <$> obj .: "object"
"customer.updated" -> CustomerEvent <$> obj .: "object"
"customer.deleted" -> CustomerEvent <$> obj .: "object"
"customer.card.created" -> CardEvent <$> obj .: "object"
"customer.card.updated" -> CardEvent <$> obj .: "object"
"customer.card.deleted" -> CardEvent <$> obj .: "object"
"customer.subscription.created" -> SubscriptionEvent <$> obj .: "object"
"customer.subscription.updated" -> SubscriptionEvent <$> obj .: "object"
"customer.subscription.deleted" -> SubscriptionEvent <$> obj .: "object"
"customer.subscription.trial_will_end" -> SubscriptionEvent <$> obj .: "object"
"customer.discount.created" -> DiscountEvent <$> obj .: "object"
"customer.discount.updated" -> DiscountEvent <$> obj .: "object"
"customer.discount.deleted" -> DiscountEvent <$> obj .: "object"
"invoice.created" -> InvoiceEvent <$> obj .: "object"
"invoice.updated" -> InvoiceEvent <$> obj .: "object"
"invoice.payment_succeeded" -> InvoiceEvent <$> obj .: "object"
"invoice.payment_failed" -> InvoiceEvent <$> obj .: "object"
"invoiceitem.created" -> InvoiceItemEvent <$> obj .: "object"
"invoiceitem.updated" -> InvoiceItemEvent <$> obj .: "object"
"invoiceitem.deleted" -> InvoiceItemEvent <$> obj .: "object"
"plan.created" -> PlanEvent <$> obj .: "object"
"plan.updated" -> PlanEvent <$> obj .: "object"
"plan.deleted" -> PlanEvent <$> obj .: "object"
"coupon.created" -> CouponEvent <$> obj .: "object"
"coupon.updated" -> CouponEvent <$> obj .: "object"
"coupon.deleted" -> CouponEvent <$> obj .: "object"
"recipient.created" -> RecipientEvent <$> obj .: "object"
"recipient.updated" -> RecipientEvent <$> obj .: "object"
"recipient.deleted" -> RecipientEvent <$> obj .: "object"
"transfer.created" -> TransferEvent <$> obj .: "object"
"transfer.updated" -> TransferEvent <$> obj .: "object"
"transfer.canceled" -> TransferEvent <$> obj .: "object"
"transfer.paid" -> TransferEvent <$> obj .: "object"
"transfer.failed" -> TransferEvent <$> obj .: "object"
"ping" -> pure Ping
_ -> pure UnknownEventData
eventObject <- o .: "object"
eventPendingWebHooks <- o .: "pending_webhooks"
eventRequest <- o .:? "request"
return Event {..}
parseJSON _ = mzero
data ConnectApp = ConnectApp {
connectAppId :: Maybe Text
, connectAppObject :: Text
, connectAppName :: Text
} deriving (Show, Eq)
instance FromJSON ConnectApp where
parseJSON (Object o) =
ConnectApp <$> o .:? "id"
<*> o .: "object"
<*> o .: "name"
parseJSON _ = mzero
newtype TokenId =
TokenId Text
deriving (Show, Eq)
data TokenType = TokenCard
| TokenBankAccount
deriving (Show, Eq)
instance FromJSON TokenType where
parseJSON (String "bank_account") = pure TokenBankAccount
parseJSON (String "card") = pure TokenCard
parseJSON _ = mzero
data Token a = Token {
tokenId :: TokenId
, tokenLiveMode :: Bool
, tokenCreated :: UTCTime
, tokenUsed :: Bool
, tokenObject :: Text
, tokenType :: TokenType
, tokenData :: a
} deriving (Show, Eq)
instance FromJSON a => FromJSON (Token a) where
parseJSON (Object o) = do
tokenId <- TokenId <$> o .: "id"
Bool tokenLiveMode <- o .: "livemode"
tokenCreated <- fromSeconds <$> o .: "created"
Bool tokenUsed <- o .: "used"
String tokenObject <- o .: "object"
String typ <- o .: "type"
tokenType <- pure $ case typ of
"card" -> TokenCard
"bank_account" -> TokenBankAccount
_ -> error "unspecified type"
tokenData <-
case typ of
"bank_account" -> o .: "bank_account"
"card" -> o .: "card"
_ -> mzero
return Token {..}
parseJSON _ = mzero
data StripeList a = StripeList {
list :: [a]
, stripeUrl :: Text
, object :: Text
, totalCount :: Maybe Int
, hasMore :: Bool
} deriving (Show, Eq)
instance FromJSON a => FromJSON (StripeList a) where
parseJSON (Object o) =
StripeList <$> o .: "data"
<*> o .: "url"
<*> o .: "object"
<*> o .:? "total_count"
<*> o .: "has_more"
parseJSON _ = mzero
type Limit = Maybe Int
type StartingAfter a = Maybe a
type EndingBefore a = Maybe a
data StripeDeleteResult = StripeDeleteResult {
deleted :: Bool
, deletedId :: Maybe Text
} deriving (Show, Eq)
instance FromJSON StripeDeleteResult where
parseJSON (Object o) =
StripeDeleteResult <$> o .: "deleted"
<*> o .:? "id"
parseJSON _ = mzero
type MetaData = [ (Text,Text) ]
type ExpandParams = [Text]
type ID = Text
type URL = Text
type Name = Text
type Description = Text
newtype Quantity = Quantity Int deriving (Show, Eq)
newtype Email = Email Text deriving (Show, Eq)
data Currency =
AED
| AFN
| ALL
| AMD
| ANG
| AOA
| ARS
| AUD
| AWG
| AZN
| BAM
| BBD
| BDT
| BGN
| BIF
| BMD
| BND
| BOB
| BRL
| BSD
| BWP
| BZD
| CAD
| CDF
| CHF
| CLP
| CNY
| COP
| CRC
| CVE
| CZK
| DJF
| DKK
| DOP
| DZD
| EEK
| EGP
| ETB
| EUR
| FJD
| FKP
| GBP
| GEL
| GIP
| GMD
| GNF
| GTQ
| GYD
| HKD
| HNL
| HRK
| HTG
| HUF
| IDR
| ILS
| INR
| ISK
| JMD
| JPY
| KES
| KGS
| KHR
| KMF
| KRW
| KYD
| KZT
| LAK
| LBP
| LKR
| LRD
| LSL
| LTL
| LVL
| MAD
| MDL
| MGA
| MKD
| MNT
| MOP
| MRO
| MUR
| MVR
| MWK
| MXN
| MYR
| MZN
| NAD
| NGN
| NIO
| NOK
| NPR
| NZD
| PAB
| PEN
| PGK
| PHP
| PKR
| PLN
| PYG
| QAR
| RON
| RSD
| RUB
| RWF
| SAR
| SBD
| SCR
| SEK
| SGD
| SHP
| SLL
| SOS
| SRD
| STD
| SVC
| SZL
| THB
| TJS
| TOP
| TRY
| TTD
| TWD
| TZS
| UAH
| UGX
| USD
| UYU
| UZS
| VND
| VUV
| WST
| XAF
| XCD
| XOF
| XPF
| YER
| ZAR
| ZMW
| UnknownCurrency
deriving (Show, Eq)
instance FromJSON Currency where
parseJSON (String "aed") = pure AED
parseJSON (String "afn") = pure AFN
parseJSON (String "all") = pure ALL
parseJSON (String "amd") = pure AMD
parseJSON (String "ang") = pure ANG
parseJSON (String "aoa") = pure AOA
parseJSON (String "ars") = pure ARS
parseJSON (String "aud") = pure AUD
parseJSON (String "awg") = pure AWG
parseJSON (String "azn") = pure AZN
parseJSON (String "bam") = pure BAM
parseJSON (String "bbd") = pure BBD
parseJSON (String "bdt") = pure BDT
parseJSON (String "bgn") = pure BGN
parseJSON (String "bif") = pure BIF
parseJSON (String "bmd") = pure BMD
parseJSON (String "bnd") = pure BND
parseJSON (String "bob") = pure BOB
parseJSON (String "brl") = pure BRL
parseJSON (String "bsd") = pure BSD
parseJSON (String "bwp") = pure BWP
parseJSON (String "bzd") = pure BZD
parseJSON (String "cad") = pure CAD
parseJSON (String "cdf") = pure CDF
parseJSON (String "chf") = pure CHF
parseJSON (String "clp") = pure CLP
parseJSON (String "cny") = pure CNY
parseJSON (String "cop") = pure COP
parseJSON (String "crc") = pure CRC
parseJSON (String "cve") = pure CVE
parseJSON (String "czk") = pure CZK
parseJSON (String "djf") = pure DJF
parseJSON (String "dkk") = pure DKK
parseJSON (String "dop") = pure DOP
parseJSON (String "dzd") = pure DZD
parseJSON (String "eek") = pure EEK
parseJSON (String "egp") = pure EGP
parseJSON (String "etb") = pure ETB
parseJSON (String "eur") = pure EUR
parseJSON (String "fjd") = pure FJD
parseJSON (String "fkp") = pure FKP
parseJSON (String "gbp") = pure GBP
parseJSON (String "gel") = pure GEL
parseJSON (String "gip") = pure GIP
parseJSON (String "gmd") = pure GMD
parseJSON (String "gnf") = pure GNF
parseJSON (String "gtq") = pure GTQ
parseJSON (String "gyd") = pure GYD
parseJSON (String "hkd") = pure HKD
parseJSON (String "hnl") = pure HNL
parseJSON (String "hrk") = pure HRK
parseJSON (String "htg") = pure HTG
parseJSON (String "huf") = pure HUF
parseJSON (String "idr") = pure IDR
parseJSON (String "ils") = pure ILS
parseJSON (String "inr") = pure INR
parseJSON (String "isk") = pure ISK
parseJSON (String "jmd") = pure JMD
parseJSON (String "jpy") = pure JPY
parseJSON (String "kes") = pure KES
parseJSON (String "kgs") = pure KGS
parseJSON (String "khr") = pure KHR
parseJSON (String "kmf") = pure KMF
parseJSON (String "krw") = pure KRW
parseJSON (String "kyd") = pure KYD
parseJSON (String "kzt") = pure KZT
parseJSON (String "lak") = pure LAK
parseJSON (String "lbp") = pure LBP
parseJSON (String "lkr") = pure LKR
parseJSON (String "lrd") = pure LRD
parseJSON (String "lsl") = pure LSL
parseJSON (String "ltl") = pure LTL
parseJSON (String "lvl") = pure LVL
parseJSON (String "mad") = pure MAD
parseJSON (String "mdl") = pure MDL
parseJSON (String "mga") = pure MGA
parseJSON (String "mkd") = pure MKD
parseJSON (String "mnt") = pure MNT
parseJSON (String "mop") = pure MOP
parseJSON (String "mro") = pure MRO
parseJSON (String "mur") = pure MUR
parseJSON (String "mvr") = pure MVR
parseJSON (String "mwk") = pure MWK
parseJSON (String "mxn") = pure MXN
parseJSON (String "myr") = pure MYR
parseJSON (String "mzn") = pure MZN
parseJSON (String "nad") = pure NAD
parseJSON (String "ngn") = pure NGN
parseJSON (String "nio") = pure NIO
parseJSON (String "nok") = pure NOK
parseJSON (String "npr") = pure NPR
parseJSON (String "nzd") = pure NZD
parseJSON (String "pab") = pure PAB
parseJSON (String "pen") = pure PEN
parseJSON (String "pgk") = pure PGK
parseJSON (String "php") = pure PHP
parseJSON (String "pkr") = pure PKR
parseJSON (String "pln") = pure PLN
parseJSON (String "pyg") = pure PYG
parseJSON (String "qar") = pure QAR
parseJSON (String "ron") = pure RON
parseJSON (String "rsd") = pure RSD
parseJSON (String "rub") = pure RUB
parseJSON (String "rwf") = pure RWF
parseJSON (String "sar") = pure SAR
parseJSON (String "sbd") = pure SBD
parseJSON (String "scr") = pure SCR
parseJSON (String "sek") = pure SEK
parseJSON (String "sgd") = pure SGD
parseJSON (String "shp") = pure SHP
parseJSON (String "sll") = pure SLL
parseJSON (String "sos") = pure SOS
parseJSON (String "srd") = pure SRD
parseJSON (String "std") = pure STD
parseJSON (String "svc") = pure SVC
parseJSON (String "szl") = pure SZL
parseJSON (String "thb") = pure THB
parseJSON (String "tjs") = pure TJS
parseJSON (String "top") = pure TOP
parseJSON (String "try") = pure TRY
parseJSON (String "ttd") = pure TTD
parseJSON (String "twd") = pure TWD
parseJSON (String "tzs") = pure TZS
parseJSON (String "uah") = pure UAH
parseJSON (String "ugx") = pure UGX
parseJSON (String "usd") = pure USD
parseJSON (String "uyu") = pure UYU
parseJSON (String "uzs") = pure UZS
parseJSON (String "vnd") = pure VND
parseJSON (String "vuv") = pure VUV
parseJSON (String "wst") = pure WST
parseJSON (String "xaf") = pure XAF
parseJSON (String "xcd") = pure XCD
parseJSON (String "xof") = pure XOF
parseJSON (String "xpf") = pure XPF
parseJSON (String "yer") = pure YER
parseJSON (String "zar") = pure ZAR
parseJSON (String "zmw") = pure ZMW
parseJSON _ = pure UnknownCurrency