Add payment response handler.
[?]
Feb 26, 2017, 12:25 AM
BSIUHCGFDFDFGWYMHZB7OVU3Z3IHPEUXRISIOPGZI2RUXZFDS2EQCDependencies
- [2]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [3]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [4]
ASF3UPJLAdd auction creation and bid handlers - [5]
AL37SVTCImplement payments service endpoints. - [6]
IZEVQF62Work in progress replacing sqlite with postgres. - [7]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [8]
O722AOKEAdd route to allow crediting of events to users/projects. - [9]
JFOEOFGAstylish-haskell formatting. - [10]
WAIX6AGNAdd event serialization for PaymentRequest & Payment - [11]
DFOBMSAOInitial work on payments API - [12]
3QVT6MA6Add database support for event amend operations. - [13]
Q5X5RYQLstylish-haskell reformatting - [14]
HALRDT2FAdded initial auction create route. - [15]
MJ6R42RCUtility methods for reading key & cert data. - [16]
NEDDHXUKReformat via stylish-haskell - [17]
RN7EI6INUpdate database layer to use CreditTo - [18]
Y3LIJ5USAdd handler for CreatePaymentRequest - [19]
HMDM3B55Implement core of payments/billing infrastructure. - [20]
73NDXDEZBegin implementation of billing event persistence. - [21]
QADKFHARAdds CreatePayment handler implementation. - [22]
SEWTRB6SImplement payment request creation functions. - [*]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [*]
ADMKQQGCInitial empty Snap project.
Change contents
- replacement in lib/Aftok/Database/PostgreSQL.hs at line 9
import qualified Crypto.Hash.BLAKE2.BLAKE2b as B2import Crypto.Random.Types (MonadRandom, getRandomBytes)import Crypto.Random.Types (MonadRandom,getRandomBytes) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 26
import Network.Haskoin.Crypto (addrToBase58, encodeBase58Check)import Network.Haskoin.Crypto (addrToBase58) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 180
PaymentRequest <$> (B.SubscriptionId <$> field)<*> (field >>= (either fail pure . runGet decodeMessage))<*> (toThyme <$> field)<*> (toThyme <$> field)PaymentRequest <$> fmap B.SubscriptionId field<*> ((either fail pure . runGet decodeMessage) =<< field)<*> fmap PaymentKey field<*> fmap toThyme field<*> fmap toThyme field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 215
Just $ storeEventJSON uid "create_billable" (billableJSON b)Just $ storeEventJSON (Just uid) "create_billable" (billableJSON b) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 218
Just $ storeEventJSON uid "create_subscription" (createSubscriptionJSON uid bid)Just $ storeEventJSON (Just uid) "create_subscription" (createSubscriptionJSON uid bid) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 220
storeEvent (CreatePaymentRequest uid req) =Just $ storeEventJSON uid "create_payment_request" (paymentRequestJSON req)storeEvent (CreatePaymentRequest req) =Just $ storeEventJSON Nothing "create_payment_request" (paymentRequestJSON req) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 223
storeEvent (CreatePayment uid req) =Just $ storeEventJSON uid "create_payment" (paymentJSON req)storeEvent (CreatePayment req) =Just $ storeEventJSON Nothing "create_payment" (paymentJSON req) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 230
storeEventJSON :: UserId -> EventType -> Value -> QDBM EventIdstoreEventJSON :: Maybe UserId -> EventType -> Value -> QDBM EventId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 237
(fromThyme timestamp, uid ^. _UserId, t, v)(fromThyme timestamp, preview (_Just . _UserId) uid, t, v) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 485
pgEval dbop @ (CreatePaymentRequest _ req) = dopgEval dbop @ (CreatePaymentRequest req) = do - edit in lib/Aftok/Database/PostgreSQL.hs at line 487
keyBytes <- getRandomBytes 64let prBytes = req ^. (paymentRequest . to (runPut . encodeMessage))urlKey = decodeUtf8 . encodeBase58Check $ B2.hash 32 keyBytes prBytes - replacement in lib/Aftok/Database/PostgreSQL.hs at line 493
, prBytes, urlKey, req ^. (paymentRequest . to (runPut . encodeMessage)), req ^. (paymentKey . _PaymentKey) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 500
headMay <$> pquery paymentRequestParser"SELECT subscription_id, request_data, request_time, billing_date \headMay <$> pquery ((,) <$> idParser PaymentRequestId <*> paymentRequestParser)"SELECT id, subscription_id, request_data, url_key, request_time, billing_date \ - replacement in lib/Aftok/Database/PostgreSQL.hs at line 503
\WHERE url_key = ?"\WHERE url_key = ? \\AND id NOT IN (SELECT payment_request_id FROM payments)" - replacement in lib/Aftok/Database/PostgreSQL.hs at line 509
"SELECT id, subscription_id, request_data, request_time, billing_date \"SELECT id, subscription_id, request_data, url_key, request_time, billing_date \ - replacement in lib/Aftok/Database/PostgreSQL.hs at line 522
\ r.subscription_id, r.request_data, r.request_time, r.billing_date, \\ r.subscription_id, r.request_data, r.url_key, r.request_time, r.billing_date, \ - replacement in lib/Aftok/Database/PostgreSQL.hs at line 533
pgEval dbop @ (CreatePayment _ p) = dopgEval dbop @ (CreatePayment p) = do - replacement in lib/Aftok/Database.hs at line 59
CreatePaymentRequest :: UserId -> PaymentRequest -> DBOp PaymentRequestIdCreatePaymentRequest :: PaymentRequest -> DBOp PaymentRequestId - replacement in lib/Aftok/Database.hs at line 62
FindPaymentRequest :: PaymentKey -> DBOp (Maybe PaymentRequest)FindPaymentRequest :: PaymentKey -> DBOp (Maybe (PaymentRequestId, PaymentRequest)) - replacement in lib/Aftok/Database.hs at line 64
CreatePayment :: UserId -> Payment -> DBOp PaymentIdCreatePayment :: Payment -> DBOp PaymentId - replacement in lib/Aftok/Database.hs at line 205
findPaymentRequest :: (MonadDB m) => PaymentKey -> m (Maybe PaymentRequest)findPaymentRequest :: (MonadDB m) => PaymentKey -> m (Maybe (PaymentRequestId, PaymentRequest)) - replacement in lib/Aftok/Payments/Types.hs at line 11
import Control.Lens (makeLenses, makePrisms, view)import Control.Lens (makeLenses, makePrisms, view) - replacement in lib/Aftok/Payments/Types.hs at line 13
import Data.Thyme.Clock as Cimport Data.Thyme.Time as Timport Data.Thyme.Clock as Cimport Data.Thyme.Time as T - replacement in lib/Aftok/Payments/Types.hs at line 17
import qualified Network.Bippy.Proto as Pimport Network.Bippy.Types (expiryTime, getExpires, getPaymentDetails)import qualified Network.Bippy.Proto as Pimport Network.Bippy.Types (expiryTime, getExpires,getPaymentDetails) - replacement in lib/Aftok/Payments/Types.hs at line 22
import Aftok.Billables (Billable, Subscription, SubscriptionId)import Aftok.Billables (Billable, Subscription, SubscriptionId) - edit in lib/Aftok/Payments/Types.hs at line 36
, _paymentKey :: PaymentKey - replacement in lib/Aftok/Payments.hs at line 18
import Crypto.Random.Types (MonadRandom)import Crypto.Random.Types (MonadRandom, getRandomBytes) - edit in lib/Aftok/Payments.hs at line 28
import Network.Haskoin.Crypto (encodeBase58Check) - replacement in lib/Aftok/Payments.hs at line 49
{ memoGen :: Subscription' UserId Billable -> m (Maybe Text) -- ^ generator user memo, uriGen :: Subscription' UserId Billable -> m (Maybe URI) -- ^ generator for payment response URL, payloadGen :: Subscription' UserId Billable -> m (Maybe ByteString) -- ^ generator for merchant payload{ -- | generator for user memomemoGen :: Subscription' UserId Billable -> T.Day -> C.UTCTime -> m (Maybe Text)-- | generator for payment response URL, uriGen :: PaymentKey -> m (Maybe URI)-- | generator for merchant payload, payloadGen :: Subscription' UserId Billable -> T.Day -> C.UTCTime -> m (Maybe ByteString) - replacement in lib/Aftok/Payments.hs at line 79
join <$> traverse (createSubscriptionPaymentRequests ops now custId) subscriptionsjoin <$> traverse (createSubscriptionPaymentRequests ops now) subscriptions - edit in lib/Aftok/Payments.hs at line 89
-> UserId - replacement in lib/Aftok/Payments.hs at line 91
createSubscriptionPaymentRequests ops now custId (sid, sub) = docreateSubscriptionPaymentRequests ops now (sid, sub) = do - replacement in lib/Aftok/Payments.hs at line 97
traverse (createPaymentRequest ops now custId sid billableSub) billableDatestraverse (createPaymentRequest ops now sid billableSub) billableDates - edit in lib/Aftok/Payments.hs at line 107
-> UserId - replacement in lib/Aftok/Payments.hs at line 111
createPaymentRequest ops now custId sid sub bday = docreatePaymentRequest ops now sid sub bday = do - replacement in lib/Aftok/Payments.hs at line 113
memo <- memoGen ops suburi <- uriGen ops subpayload <- payloadGen ops sub-- TODO: maybepkey <- PaymentKey . decodeUtf8 . encodeBase58Check <$> getRandomBytes 32memo <- memoGen ops sub bday nowuri <- uriGen ops pkeypayload <- payloadGen ops sub bday now - replacement in lib/Aftok/Payments.hs at line 121
liftdb $ CreatePaymentRequest custId (PaymentRequest sid req now bday)liftdb $ CreatePaymentRequest (PaymentRequest sid req pkey now bday) - replacement in server/Aftok/Snaplet/Payments.hs at line 1
module Aftok.Snaplet.Payments wheremodule Aftok.Snaplet.Payments( listPayableRequestsHandler, getPaymentRequestHandler, paymentResponseHandler) where - replacement in server/Aftok/Snaplet/Payments.hs at line 9
import Control.Lens (view)import Data.Thyme.Clock as Cimport Network.Bippy.Proto as Pimport Control.Lens (view, _1, _2)import Data.ProtocolBuffers (decodeMessage)import Data.Serialize.Get (runGetLazy)import Data.Thyme.Clock as Cimport qualified Network.Bippy.Proto as P - replacement in server/Aftok/Snaplet/Payments.hs at line 15
import Snap.Snaplet as Simport Snap.Core (readRequestBody)import Snap.Snaplet as S - edit in server/Aftok/Snaplet/Payments.hs at line 19
import Aftok.Database - edit in server/Aftok/Snaplet/Payments.hs at line 21
import Aftok.Database - replacement in server/Aftok/Snaplet/Payments.hs at line 33
getPaymentRequestHandler = dopkBytes <- requireParam "paymentRequestKey"pkey <- maybe(snapError 400 $ "parameter paymentRequestKey is formatted incorrectly.") puregetPaymentRequestHandler =view (_2 . paymentRequest) <$> getPaymentRequestHandler'paymentResponseHandler :: S.Handler App App PaymentIdpaymentResponseHandler = dorequestBody <- readRequestBody 4096preq <- getPaymentRequestHandler'pmnt <- either(\msg -> snapError 400 $ "Could not decode payment response: " <> tshow msg)pure(runGetLazy decodeMessage requestBody)now <- liftIO $ C.getCurrentTimesnapEval . liftdb . CreatePayment $ Payment (view _1 preq) pmnt nowgetPaymentRequestHandler' :: S.Handler App App (PaymentRequestId, PaymentRequest)getPaymentRequestHandler' = dopkBytes <- requireParam "paymentRequestKey"pkey <- maybe(snapError 400 $ "parameter paymentRequestKey is formatted incorrectly.") pure - replacement in server/Aftok/Snaplet/Payments.hs at line 55[2.1934]→[2.1934:1985](∅→∅),[3.1418]→[3.17952:17953](∅→∅),[2.1985]→[3.17952:17953](∅→∅),[3.6832]→[3.17952:17953](∅→∅),[3.10307]→[3.17952:17953](∅→∅),[3.17953]→[3.5390:5391](∅→∅),[3.5391]→[3.10307:10308](∅→∅),[3.17956]→[3.10307:10308](∅→∅),[3.10307]→[3.10307:10308](∅→∅),[3.10308]→[3.17957:17958](∅→∅)
(pure . view paymentRequest)prMaypure prMay - edit in server/Aftok/Snaplet/Payments.hs at line 59
- replacement in server/Main.hs at line 62
paymentRequestRoute = writeLBS . runPutLazy . encodeMessage =<< method GET getPaymentRequestHandlerpaymentRoute = (writeLBS . runPutLazy . encodeMessage =<< method GET getPaymentRequestHandler)<|> (void $ method POST paymentResponseHandler) - replacement in server/Main.hs at line 88
, ("pay/:paymentRequestKey", paymentRequestRoute), ("pay/:paymentRequestKey", paymentRoute)