diff --git a/src/PaymentServer/Processors/Stripe.hs b/src/PaymentServer/Processors/Stripe.hs index 3aa84a6eea156bc01e442cacaf67170f8a46da0a..090983befca388bf1e9b3d39c15013876766d94e 100644 --- a/src/PaymentServer/Processors/Stripe.hs +++ b/src/PaymentServer/Processors/Stripe.hs @@ -16,6 +16,8 @@ import Text.Printf ) import Data.Aeson ( ToJSON(toJSON) + , FromJSON(parseJSON) + , Object , object ) import Servant @@ -61,9 +63,8 @@ getVoucher (MetaData (x:xs)) = getVoucher (MetaData xs) stripeServer :: VoucherDatabase d => d -> Server StripeAPI stripeServer = webhook +-- | Process charge succeeded events webhook :: VoucherDatabase d => d -> Event -> Handler Acknowledgement - --- Process charge succeeded events webhook d Event{eventId=Just (EventId eventId), eventType=ChargeSucceededEvent, eventData=(ChargeEvent charge)} = case getVoucher $ chargeMetaData charge of Nothing -> @@ -83,3 +84,20 @@ webhook d Event{eventId=Just (EventId eventId), eventType=ChargeSucceededEvent, webhook d _ = -- TODO: Record the eventId somewhere. return Ok + + +-- | Browser facing API that takes token, voucher and a few other information +-- and calls stripe charges API. If payment succeeds, then the voucher is stored +-- in the voucher database. +type BrowserAPI = "charge" :> ReqBody '[JSON] Token :> Post '[JSON] Acknowledgement + +data Token = Token + { token :: Text + , voucher :: Voucher + } deriving (Show, Eq) + +instance FromJSON Token where + parseJSON (Object v) = Token <$> + v .: "token" <*> + v .: "voucher" + parseJSON _ = mzero