Skip to content
Snippets Groups Projects
JSON.hs 4.46 KiB
Newer Older
{-# LANGUAGE OverloadedStrings #-}

module Util.JSON where

import Data.Time.Clock.POSIX
  ( utcTimeToPOSIXSeconds
  )
import Data.HashMap.Lazy
  ( fromList
  )
import qualified Data.Sequence as Seq
import Web.Stripe.Types
  ( Charge(Charge)
  , ChargeId(ChargeId)
  , InvoiceId(InvoiceId)
  , Amount(Amount)
  , Currency(USD, UnknownCurrency)
  , MetaData(MetaData)
  , StripeList(StripeList)
  , Refund(Refund)
  , RefundId(RefundId)
  , TransactionId(TransactionId)
  , Expandable(Id)
  )
import Web.Stripe.Event
  ( Event(Event)
  , EventData(ChargeEvent)
  , EventType(ChargeSucceededEvent)
  , EventId(EventId)
  )
import Data.Aeson
  ( ToJSON(toJSON)
  , Value(String, Number, Object, Array)
  , object
  , (.=)
  )

instance ToJSON Event where
  toJSON (Event
           eventId
           eventCreated
           eventLiveMode
           eventType
           eventData
           eventObject
           eventPendingWebHooks
           eventRequest)
    = object
    [ "id" .= eventId
    , "object" .= eventObject
    , "api_version" .= String "2018-05-21"
    , "created" .= utcTimeToPOSIXSeconds eventCreated
    , "data" .= object [ "object" .= eventData ]
    , "type" .= eventType
    , "livemode" .= eventLiveMode
    , "pending_webhooks" .= eventPendingWebHooks
    , "request" .= eventRequest
    ]

instance ToJSON a => ToJSON (Expandable a) where
  toJSON (Id eId) = toJSON eId

instance ToJSON EventId where
  toJSON (EventId eId) = String eId

instance ToJSON InvoiceId where
  toJSON (InvoiceId iId) = String iId

instance ToJSON ChargeId where
  toJSON (ChargeId cId) = String cId

instance ToJSON RefundId where
  toJSON (RefundId rId) = String rId

instance ToJSON TransactionId where
  toJSON (TransactionId tId) = String tId

instance ToJSON Currency where
  toJSON USD = "USD"

instance ToJSON EventType where
  toJSON ChargeSucceededEvent = "charge.succeeded"

instance ToJSON EventData where
  toJSON (ChargeEvent charge) = toJSON charge

instance ToJSON Amount where
  toJSON (Amount a) = Number $ fromIntegral a

instance ToJSON MetaData where
  toJSON (MetaData items) = (Object . fromList . map (\(k, v) -> (k, String v))) items

instance ToJSON Refund where
  toJSON (Refund
           refundId
           refundAmount
           refundCurrency
           refundCreated
           refundObject
           refundCharge
           refundBalanceTransaction
           refundMetaData
         )
    = object
    [ "id" .= refundId
    , "amount" .= refundAmount
    , "currency" .= refundCurrency
    , "created" .= utcTimeToPOSIXSeconds refundCreated
    , "object" .= refundObject
    , "charge" .= refundCharge
    , "balance_transaction" .= refundBalanceTransaction
    , "metadata" .= refundMetaData
    ]

instance (ToJSON a) => ToJSON (StripeList a) where
  toJSON (StripeList elements stripeUrl obj totalCount hasMore)
    = object
    [ "data" .= toJSON elements
    , "url" .= stripeUrl
    , "object" .= obj
    , "has_more" .= hasMore
    ]

instance ToJSON Charge where
  toJSON (Charge
           chargeId
           chargeObject
           chargeCreated
           chargeLiveMode
           chargePaid
           chargeAmount
           chargeCurrency
           chargeRefunded
           chargeCreditChard
           chargeCaptured
           chargeRefunds
           chargeBalanceTransaction
           chargeFailureMessage
           chargeFailureCode
           chargeAmountRefunded
           chargeCustomerId
           chargeInvoice
           chargeDescription
           chargeDispute
           chargeMetaData
           chargeStatementDescription
           chargeReceiptEmail
           chargeNumber
         )
    = object
    [ "id"         .= chargeId
    , "object"     .= chargeObject
    , "amount"     .= chargeAmount
    , "amount_refunded" .= chargeAmountRefunded
    -- , "balance_transaction" .= chargeBalanceTransaction
    , "captured" .= chargeCaptured
    , "created"    .= utcTimeToPOSIXSeconds chargeCreated
    , "currency"   .= chargeCurrency
    -- , "customer" .= chargeCustomerId
    -- , "description" .= chargeDescription
    -- , "dispute" .= chargeDispute
    -- , "failure_code" .= chargeFailureCode
    -- , "failure_message" .= chargeFailureMessage
    -- , "invoice" .= chargeInvoice
    , "livemode" .= chargeLiveMode
    , "metadata" .= chargeMetaData
    , "paid" .= chargePaid
    , "receipt_email" .= chargeReceiptEmail
    , "refunded" .= chargeRefunded
    , "refunds" .= chargeRefunds