Skip to content
Snippets Groups Projects
JSON.hs 4.46 KiB
Newer Older
  • Learn to ignore specific revisions
  • {-# 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