Implement core of payments/billing infrastructure.
[?]
Jan 22, 2017, 5:42 AM
HMDM3B557TO5RYP2IGFFC2C2VN6HYZTDQ47CJY2O37BW55DSMFZACDependencies
- [2]
Q5X5RYQLstylish-haskell reformatting - [3]
4QX5E5ACInitial compilation of payouts function succeeds. - [4]
73NDXDEZBegin implementation of billing event persistence. - [5]
NTPC7KJETrivial changes, feature scratchpad. - [6]
DFOBMSAOInitial work on payments API - [7]
Z7KS5XHHVery WIP. Wow. - [8]
SLL7262CMake depreciation functions more flexible. - [9]
6L5BK5EHUse generic SMTP rather than Sendmail-specific mail client. - [10]
NLZ3JXLOFix formatting with stylish-haskell. - [11]
V2VDN77HEnable postgres configuration via environment variable for Heroku. - [12]
OBFPJS2GProject successfully builds and tests under nix. - [13]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [14]
KEP5WUFJConvert project to stack-based build. - [15]
NAS4BFL4Trivial stylish-haskell reformat. - [16]
LD4GLVSFMore database stuff. - [17]
5OI44E4EAdd authentication to auction search. - [18]
5DRIWGLUImproving TimeLog specs - [19]
7HPY3QPFFix linting errors. (yay hlint!) - [20]
WZUHEZSBStart of migration back toward snap. - [21]
WO2MINIFAuctions now compile! - [22]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [23]
HALRDT2FAdded initial auction create route. - [24]
FXJQACESEnsure that auction is not ended at the time of bid - [25]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [26]
WFZDMVUXRename ADB -> QDB - [27]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [28]
BXGLKYRXAdded primitive user registration handler. - [29]
5XFJNUAZStart of addition of project infrastructure. - [30]
TNR3TEHKSwitch to Postgres + snaplet arch compiles. - [31]
O722AOKEAdd route to allow crediting of events to users/projects. - [32]
PBD7LZYQPostgres & auth are beginning to function. - [33]
BROSTG5KBeginning of modularization of server. - [34]
KNSI575VCleanup of EventLog types. - [35]
EZQG2APBUpdate task list. - [36]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [37]
3QVT6MA6Add database support for event amend operations. - [38]
A6HKMINBAttempting to improve JSON handling. - [39]
ZP62WC47Begin conversion to build with stack. - [40]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [41]
UILI6PILThe route-based logStart/logStop is nicer. - [42]
2G3GNDDUEvent logging is now functioning in postgres. - [43]
EKY7U7SKFinish conversion to stack. - [44]
Z3MK2PJ5Add GET handler for retrieving auction data. - [45]
RN7EI6INUpdate database layer to use CreditTo - [46]
VJPT6HDRFix remaining type errors after addition of login handler. - [47]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [48]
M4KM76DGMerge branch 'stackify' - [49]
POX3UAMTEnabling logging of time to contributor/project accounts - [50]
BWN72T44Don't accept work timestamp from an external source. - [51]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [52]
LHJ2HFXVAdd property test for auction algorithm. - [53]
FD7SV5I6Fix handling of event_t columns. - [54]
NEDDHXUKReformat via stylish-haskell - [55]
UUR6SMCAAdd start of specs for auctions. - [56]
EKI57EJRAdd alternative implementation of auction winner determination. - [57]
ASF3UPJLAdd auction creation and bid handlers - [58]
4IQVQL4TAdded client for payouts endpoint. - [59]
5ZSKPQ3KAdd created_at and auction_start timestamps to auction - [60]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [61]
Y3LIJ5USAdd handler for CreatePaymentRequest - [62]
TCOAKCGGCompleted conversion to snap. - [63]
7VGYLTMUClean up schema version handling. - [64]
MB5SHULBAdd route for accepting an invitation with an existing account - [65]
QADKFHARAdds CreatePayment handler implementation. - [66]
I2KHGVD4Require project permissions for access to most data. - [67]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [68]
IZEVQF62Work in progress replacing sqlite with postgres. - [69]
WAIX6AGNAdd event serialization for PaymentRequest & Payment - [70]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [*]
W35DDBFYFactor common JSON conversions up into client lib module. - [*]
NVOCQVASInitial failing tests. - [*]
LCBJULKEFix swapped default and key in QConfig. - [*]
ADMKQQGCInitial empty Snap project. - [*]
AXKKXBWNInitial attempt at writing down my ideas for a company based on trust.
Change contents
- edit in aftok.cabal at line 32
Aftok.Payments.Types - replacement in aftok.cabal at line 40[3.1607]→[3.245:280](∅→∅),[3.280]→[3.229:266](∅→∅),[3.266]→[3.280:316](∅→∅),[3.280]→[3.280:316](∅→∅),[3.316]→[3.267:303](∅→∅),[3.303]→[3.50:86](∅→∅),[3.50]→[3.50:86](∅→∅),[3.86]→[3.75:75](∅→∅),[3.75]→[3.387:422](∅→∅),[3.86]→[3.387:422](∅→∅),[3.86]→[3.387:422](∅→∅),[3.387]→[3.387:422](∅→∅)
base >= 4.8.0, bippy == 0.1.0.0, classy-prelude == 0.12.*, aeson >= 0.11.2, attoparsec == 0.13.*, base64-bytestring == 1.0.*base, bippy, classy-prelude, aeson, attoparsec, base64-bytestring - replacement in aftok.cabal at line 50
, containers >= 0.5.6, containers - replacement in aftok.cabal at line 52
, either >= 4.4.1, errors == 2.1.*, cryptonite, either, errors - replacement in aftok.cabal at line 56[3.46]→[3.542:589](∅→∅),[3.589]→[3.304:337](∅→∅),[3.337]→[3.589:636](∅→∅),[3.589]→[3.589:636](∅→∅),[3.636]→[3.2794:2841](∅→∅),[3.2794]→[3.2794:2841](∅→∅),[3.2841]→[3.637:685](∅→∅)
, groups >= 0.4 && < 0.5, haskoin-core >= 0.4, heaps >= 0.3.1 && < 0.4, hourglass >= 0.2.6 && < 0.3, HsOpenSSL >= 0.11 && < 0.12, groups, haskoin-core, heaps, hourglass - replacement in aftok.cabal at line 61
, lens >= 4.11, lens - replacement in aftok.cabal at line 63[3.11]→[3.781:815](∅→∅),[3.77]→[3.781:815](∅→∅),[3.206]→[3.781:815](∅→∅),[3.206]→[3.781:815](∅→∅),[3.781]→[3.781:815](∅→∅),[3.815]→[3.338:375](∅→∅)
, old-locale >= 1.0, postgresql-simple >= 0.5.2.0, network-uri, old-locale, postgresql-simple - replacement in aftok.cabal at line 67[3.30]→[3.862:909](∅→∅),[3.242]→[3.862:909](∅→∅),[3.242]→[3.862:909](∅→∅),[3.375]→[3.862:909](∅→∅),[3.862]→[3.862:909](∅→∅)
, safe >= 0.3.9 && < 0.4, safe - replacement in aftok.cabal at line 71
, text >= 1.2.1 && < 1.3, thyme >= 0.3.5 && < 0.4, uuid >= 1.3.10 && < 1.4, text, thyme, uuid - replacement in aftok.cabal at line 76
, wreq >= 0.4, wreq - replacement in aftok.cabal at line 97
, hspec >= 2.1.7, hspec - replacement in aftok.cabal at line 102
, QuickCheck >= 2.8, QuickCheck - replacement in aftok.cabal at line 144
, HStringTemplate >= 0.8.3, HStringTemplate - replacement in aftok.cabal at line 146
, HsOpenSSL--, HsOpenSSL - replacement in aftok.cabal at line 149
, mtl >= 2.2 && < 3, MonadCatchIO-transformers >= 0.3 && < 0.4, mtl--, MonadCatchIO-transformers - replacement in aftok.cabal at line 154[3.7376]→[3.7298:7326](∅→∅),[3.7326]→[3.52:95](∅→∅),[3.95]→[3.1388:1584](∅→∅),[3.1388]→[3.1388:1584](∅→∅)
, resource-pool-catchio, smtp-mail >= 0.1.4.5, snap >= 0.14, snap-core >= 0.9 && < 0.11, snap-server >= 0.9 && < 0.11, snaplet-postgresql-simple >= 0.6 && < 0.11--, resource-pool-catchio, smtp-mail, snap, snap-core, snap-server, snaplet-postgresql-simple - edit in lib/Aftok/Billables.hs at line 2
{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE DeriveFoldable #-}{-# LANGUAGE DeriveTraversable #-} - edit in lib/Aftok/Billables.hs at line 11
import Data.Thyme.Clock as Cimport Data.UUID - edit in lib/Aftok/Billables.hs at line 18
import Data.UUID - edit in lib/Aftok/Billables.hs at line 44[3.689]→[3.689:742](∅→∅),[3.742]→[2.385:454](∅→∅),[2.454]→[3.1340:1365](∅→∅),[3.1340]→[3.1340:1365](∅→∅),[3.1365]→[2.455:508](∅→∅),[2.508]→[3.1412:1441](∅→∅),[3.1412]→[3.1412:1441](∅→∅),[3.1441]→[3.762:837](∅→∅),[3.837]→[3.1463:1464](∅→∅),[3.1463]→[3.1463:1464](∅→∅)
data Billable' (p :: *) (u :: *) (c :: *) = Billable{ _project :: p, _creator :: u, _name :: Text, _description :: Text, _recurrence :: Recurrence, _amount :: c, _gracePeriod :: Days}makeLenses ''Billable'type Billable = Billable' ProjectId UserId Satoshi - edit in lib/Aftok/Billables.hs at line 58
data Billable' p u c = Billable{ _project :: p, _creator :: u, _name :: Text, _description :: Text, _recurrence :: Recurrence, _amount :: c, _gracePeriod :: Days, _requestExpiryPeriod :: Maybe C.NominalDiffTime}makeLenses ''Billable' - edit in lib/Aftok/Billables.hs at line 71
type Billable = Billable' ProjectId UserId Satoshi - edit in lib/Aftok/Billables.hs at line 75
data Subscription' b = Subscription{ _billable :: b, _startTime :: C.UTCTime, _endTime :: Maybe C.UTCTime} deriving (Functor, Foldable, Traversable)makeLenses ''Subscription' - edit in lib/Aftok/Billables.hs at line 83[3.1030]
type Subscription = Subscription' BillableId - edit in lib/Aftok/Database/PostgreSQL.hs at line 10
import qualified Data.ByteString.Char8 as B - replacement in lib/Aftok/Database/PostgreSQL.hs at line 26
import qualified Aftok.Billables as BIimport qualified Aftok.Billables as B - replacement in lib/Aftok/Database/PostgreSQL.hs at line 32
subscriptionJSON)createSubscriptionJSON) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 48[3.1216]→[3.1216:1290](∅→∅),[3.1290]→[3.1340:1423](∅→∅),[3.1423]→[3.83:84](∅→∅),[3.83]→[3.83:84](∅→∅),[3.84]→[3.1290:1373](∅→∅),[3.1290]→[3.1290:1373](∅→∅)
uidParser :: FieldParser UserIduidParser f v = UserId <$> fromField f vpidParser :: FieldParser P.ProjectIdpidParser f v = P.ProjectId <$> fromField f vsecondsParser :: FieldParser SecondssecondsParser f v = Seconds <$> fromField f vuidParser :: RowParser UserIduidParser = UserId <$> field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 51
usernameParser :: FieldParser UserNameusernameParser f v = UserName <$> fromField f vpidParser :: RowParser P.ProjectIdpidParser = P.ProjectId <$> field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 54
emailParser :: FieldParser EmailemailParser f v = Email <$> fromField f vsubscriptionIdParser :: RowParser B.SubscriptionIdsubscriptionIdParser = B.SubscriptionId <$> field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 60
let err = ConversionFailed { errSQLType = "text", errSQLTableOid = tableOid f, errSQLField = maybe "" B.unpack (name f), errHaskellType = "BtcAddr", errMessage = "could not deserialize value to a valid BTC address"}maybe (conversionError err) pure addrMaylet err = returnError ConversionFailed f "could not deserialize value to a valid BTC address"maybe err pure addrMay - replacement in lib/Aftok/Database/PostgreSQL.hs at line 63
btcParser :: FieldParser SatoshibtcParser f v = (Satoshi . fromInteger) <$> fromField f vbtcParser :: RowParser SatoshibtcParser = (Satoshi . fromInteger) <$> field - replacement in lib/Aftok/Database/PostgreSQL.hs at line 66
utcParser :: FieldParser C.UTCTimeutcParser f v = toThyme <$> fromField f vutcParser :: RowParser C.UTCTimeutcParser = toThyme <$> field - edit in lib/Aftok/Database/PostgreSQL.hs at line 72[3.114]→[3.1424:1533](∅→∅),[3.1533]→[2.1083:1188](∅→∅),[2.1188]→[3.1632:1692](∅→∅),[3.1632]→[3.1632:1692](∅→∅),[3.1692]→[2.1189:1325](∅→∅),[2.1325]→[3.1810:1832](∅→∅),[3.1810]→[3.1810:1832](∅→∅)
recurrenceParser :: RowParser BI.RecurrencerecurrenceParser =let prec :: Text -> RowParser BI.Recurrenceprec "annually" = nullField *> pure BI.Annuallyprec "monthly" = BI.Monthly <$> fieldprec "semimonthly" = nullField *> pure BI.SemiMonthlyprec "weekly" = BI.Weekly <$> fieldprec "onetime" = nullField *> pure BI.OneTimeprec _ = emptyin field >>= prec - edit in lib/Aftok/Database/PostgreSQL.hs at line 78
nominalDiffTimeParser :: FieldParser NominalDiffTimenominalDiffTimeParser f v =C.fromSeconds' <$> fromField f v - replacement in lib/Aftok/Database/PostgreSQL.hs at line 90
parser "credit_to_user" = CreditToUser <$> (nullField *> fieldWith uidParser <* nullField)parser "credit_to_project" = CreditToProject <$> (nullField *> nullField *> fieldWith pidParser)parser "credit_to_user" = CreditToUser <$> (nullField *> uidParser <* nullField)parser "credit_to_project" = CreditToProject <$> (nullField *> nullField *> pidParser) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 102[3.402]→[3.336:403](∅→∅),[3.1731]→[3.336:403](∅→∅),[3.1967]→[3.336:403](∅→∅),[3.336]→[3.336:403](∅→∅)
<*> (fieldWith eventTypeParser <*> fieldWith utcParser)<*> (fieldWith eventTypeParser <*> utcParser) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 107
(,,) <$> fieldWith pidParser<*> fieldWith uidParser(,,) <$> pidParser<*> uidParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 113
A.Auction <$> fieldWith pidParser<*> fieldWith uidParser<*> fieldWith utcParser<*> fieldWith btcParser<*> fieldWith utcParser<*> fieldWith utcParserA.Auction <$> pidParser<*> uidParser<*> utcParser<*> btcParser<*> utcParser<*> utcParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 122
A.Bid <$> fieldWith uidParser<*> fieldWith secondsParser<*> fieldWith btcParser<*> fieldWith utcParserA.Bid <$> uidParser<*> (Seconds <$> field)<*> btcParser<*> utcParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 129
User <$> fieldWith usernameParserUser <$> (UserName <$> field) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 135
(,) <$> fieldWith uidParser(,) <$> uidParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 141
<*> fieldWith utcParser<*> fieldWith uidParser<*> utcParser<*> uidParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 147
P.Invitation <$> fieldWith pidParser<*> fieldWith uidParser<*> fieldWith emailParser<*> fieldWith utcParserP.Invitation <$> pidParser<*> uidParser<*> fmap Email field<*> utcParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 155
(,) <$> fieldWith pidParser(,) <$> pidParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 158
billableParser :: RowParser BI.BillablebillableParser :: RowParser B.Billable - replacement in lib/Aftok/Database/PostgreSQL.hs at line 160
BI.Billable <$> fieldWith pidParser<*> fieldWith uidParser<*> field<*> field<*> recurrenceParser<*> fieldWith btcParser<*> (Days <$> field)B.Billable <$> pidParser<*> uidParser<*> field<*> field<*> recurrenceParser<*> btcParser<*> (Days <$> field)<*> fieldWith (optionalField nominalDiffTimeParser)recurrenceParser :: RowParser B.RecurrencerecurrenceParser =let prec :: Text -> RowParser B.Recurrenceprec "annually" = nullField *> pure B.Annuallyprec "monthly" = B.Monthly <$> fieldprec "semimonthly" = nullField *> pure B.SemiMonthlyprec "weekly" = B.Weekly <$> fieldprec "onetime" = nullField *> pure B.OneTimeprec _ = emptyin field >>= precsubscriptionParser :: RowParser B.SubscriptionsubscriptionParser =B.Subscription <$> (B.BillableId <$> field)<*> (toThyme <$> field)<*> ((fmap toThyme) <$> field) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 211
storeEvent (CreateSubscription uid bid) =Just $ storeEventJSON uid "create_subscription" (subscriptionJSON uid bid)storeEvent (CreateSubscription uid s) =Just $ storeEventJSON uid "create_subscription" (createSubscriptionJSON uid s) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 233
updateCache :: DBOp a -> QDBM aupdateCache (CreateEvent (P.ProjectId pid) (UserId uid) (LogEntry c e m)) =pgEval :: DBOp a -> QDBM apgEval (CreateEvent (P.ProjectId pid) (UserId uid) (LogEntry c e m)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 260
updateCache (FindEvent (EventId eid)) =pgEval (FindEvent (EventId eid)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 268
updateCache (FindEvents (P.ProjectId pid) (UserId uid) ival) =pgEval (FindEvents (P.ProjectId pid) (UserId uid) ival) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 284
updateCache (AmendEvent (EventId eid) (TimeChange mt t)) =pgEval (AmendEvent (EventId eid) (TimeChange mt t)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 291
updateCache (AmendEvent (EventId eid) (CreditToChange mt c)) =pgEval (AmendEvent (EventId eid) (CreditToChange mt c)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 314
updateCache (AmendEvent (EventId eid) (MetadataChange mt v)) =pgEval (AmendEvent (EventId eid) (MetadataChange mt v)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 321
updateCache (ReadWorkIndex (P.ProjectId pid)) = dopgEval (ReadWorkIndex (P.ProjectId pid)) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 327
updateCache (CreateAuction auc) =pgEval (CreateAuction auc) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 337
updateCache (FindAuction aucId) =pgEval (FindAuction aucId) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 342
updateCache (CreateBid (A.AuctionId aucId) bid) =pgEval (CreateBid (A.AuctionId aucId) bid) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 353
updateCache (ReadBids aucId) =pgEval (ReadBids aucId) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 358
updateCache (CreateUser user') =pgEval (CreateUser user') = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 368
updateCache (FindUser (UserId uid)) =pgEval (FindUser (UserId uid)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 373
updateCache (FindUserByName (UserName h)) =pgEval (FindUserByName (UserName h)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 378
updateCache (CreateInvitation (P.ProjectId pid) (UserId uid) (Email e) t) = dopgEval (CreateInvitation (P.ProjectId pid) (UserId uid) (Email e) t) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 386
updateCache (FindInvitation ic) =pgEval (FindInvitation ic) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 392
updateCache (AcceptInvitation (UserId uid) ic t) = transactQDBM $ dopgEval (AcceptInvitation (UserId uid) ic t) = transactQDBM $ do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 403
updateCache (CreateProject p) =pgEval (CreateProject p) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 409
updateCache (FindProject (P.ProjectId pid)) =pgEval (FindProject (P.ProjectId pid)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 414
updateCache (FindUserProjects (UserId uid)) =pgEval (FindUserProjects (UserId uid)) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 422
updateCache (AddUserToProject pid current new) = void $pgEval (AddUserToProject pid current new) = void $ - replacement in lib/Aftok/Database/PostgreSQL.hs at line 427
updateCache dbop @ (CreateBillable _ b) = dopgEval dbop @ (CreateBillable _ b) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 429
pinsert BI.BillableIdpinsert B.BillableId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 433
( b ^. (BI.project . P._ProjectId)( b ^. (B.project . P._ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 435
, b ^. BI.name, b ^. BI.description, b ^. (BI.recurrence . to BI.recurrenceName), b ^. (BI.recurrence . to BI.recurrenceCount), b ^. (BI.amount . satoshi), b ^. (BI.gracePeriod . _Days), b ^. B.name, b ^. B.description, b ^. (B.recurrence . to B.recurrenceName), b ^. (B.recurrence . to B.recurrenceCount), b ^. (B.amount . satoshi), b ^. (B.gracePeriod . _Days) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 443
updateCache (ReadBillable bid) =pgEval (ReadBillable bid) = - replacement in lib/Aftok/Database/PostgreSQL.hs at line 449
(Only (bid ^. BI._BillableId))(Only (bid ^. B._BillableId)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 451
updateCache dbop @ (CreateSubscription uid bid) = dopgEval dbop @ (CreateSubscription uid s) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 453
pinsert BI.SubscriptionIdpinsert B.SubscriptionId - replacement in lib/Aftok/Database/PostgreSQL.hs at line 457
(uid ^. _UserId, bid ^. BI._BillableId, eventId ^. _EventId)(uid ^. _UserId, s ^. (B.billable . B._BillableId), eventId ^. _EventId)pgEval (FindSubscriptions uid pid) =pquery ((,) <$> subscriptionIdParser <*> subscriptionParser)"SELECT id, billable_id, start_date, end_date \\FROM subscriptions s \\JOIN billables b ON b.id = s.billable_id \\WHERE s.user_id = ? \\AND b.project_id = ?"(uid ^. _UserId, pid ^. P._ProjectId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 468
updateCache dbop @ (CreatePaymentRequest _ req) = dopgEval dbop @ (CreatePaymentRequest _ req) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 475
( req ^. (subscription . BI._SubscriptionId)( req ^. (subscription . B._SubscriptionId) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 480
updateCache dbop @ (CreatePayment _ req) = dopgEval dbop @ (CreatePayment _ req) = do - replacement in lib/Aftok/Database/PostgreSQL.hs at line 491
updateCache (RaiseDBError err _) = raiseError errpgEval (RaiseDBError err _) = raiseError err - replacement in lib/Aftok/Database/PostgreSQL.hs at line 499
instance DBEval QDBM wheredbEval e = updateCache e[3.3947]instance MonadDB QDBM whereliftdb = pgEval - edit in lib/Aftok/Database.hs at line 2
{-# LANGUAGE FlexibleInstances #-} - edit in lib/Aftok/Database.hs at line 4
{-# LANGUAGE TupleSections #-} - replacement in lib/Aftok/Database.hs at line 10
import Control.Lensimport Control.Lens (view, (^.)) - replacement in lib/Aftok/Database.hs at line 18
import Aftok.Paymentsimport Aftok.Payments.Types - edit in lib/Aftok/Database.hs at line 28
type DBProg a = Program DBOp a - replacement in lib/Aftok/Database.hs at line 56
CreateSubscription :: UserId -> BillableId -> DBOp SubscriptionIdCreateSubscription :: UserId -> Subscription -> DBOp SubscriptionIdFindSubscriptions :: UserId -> ProjectId -> DBOp [(SubscriptionId, Subscription)] - replacement in lib/Aftok/Database.hs at line 78
raiseOpForbidden :: UserId -> OpForbiddenReason -> DBOp x -> DBOp xraiseOpForbidden uid r = RaiseDBError (OpForbidden uid r)class (Monad m) => MonadDB (m :: * -> *) whereliftdb :: DBOp x -> m xinstance MonadDB (Program DBOp) whereliftdb = fc - replacement in lib/Aftok/Database.hs at line 84
raiseSubjectNotFound :: DBOp y -> DBOp xraiseSubjectNotFound = RaiseDBError SubjectNotFoundraiseOpForbidden :: (MonadDB m) => UserId -> OpForbiddenReason -> DBOp x -> m xraiseOpForbidden uid r op = liftdb $ RaiseDBError (OpForbidden uid r) op - replacement in lib/Aftok/Database.hs at line 87
class DBEval m wheredbEval :: DBOp a -> m araiseSubjectNotFound :: (MonadDB m) => DBOp y -> m xraiseSubjectNotFound op = liftdb $ RaiseDBError SubjectNotFound op - replacement in lib/Aftok/Database.hs at line 92
createUser :: User -> DBProg UserIdcreateUser = fc . CreateUsercreateUser :: (MonadDB m) => User -> m UserIdcreateUser = liftdb . CreateUser - replacement in lib/Aftok/Database.hs at line 95
findUser :: UserId -> DBProg (Maybe User)findUser = fc . FindUserfindUser :: (MonadDB m) => UserId -> m (Maybe User)findUser = liftdb . FindUser - replacement in lib/Aftok/Database.hs at line 98
findUserByName :: UserName -> DBProg (Maybe KeyedUser)findUserByName = fc . FindUserByNamefindUserByName :: (MonadDB m) => UserName -> m (Maybe KeyedUser)findUserByName = liftdb . FindUserByName - replacement in lib/Aftok/Database.hs at line 103
createProject :: Project -> DBProg ProjectIdcreateProject :: (MonadDB m) => Project -> m ProjectId - replacement in lib/Aftok/Database.hs at line 105
pid <- fc $ CreateProject ppid <- liftdb $ CreateProject p - replacement in lib/Aftok/Database.hs at line 109
findProject :: ProjectId -> UserId -> DBProg (Maybe Project)findProject :: (MonadDB m) => ProjectId -> UserId -> m (Maybe Project) - replacement in lib/Aftok/Database.hs at line 114
findUserProjects :: UserId -> DBProg [KeyedProject]findUserProjects = fc . FindUserProjectsfindUserProjects :: (MonadDB m) => UserId -> m [KeyedProject]findUserProjects = liftdb . FindUserProjects - replacement in lib/Aftok/Database.hs at line 117
withProjectAuth :: ProjectId -> UserId -> DBOp a -> DBProg awithProjectAuth :: (MonadDB m) => ProjectId -> UserId -> DBOp a -> m a - replacement in lib/Aftok/Database.hs at line 120
fc $ if any (\(pid', _) -> pid' == pid) pxthen actif any (\(pid', _) -> pid' == pid) pxthen liftdb act - replacement in lib/Aftok/Database.hs at line 124
checkProjectAuth :: ProjectId -> UserId -> DBOp a -> DBProg ()checkProjectAuth :: (MonadDB m) => ProjectId -> UserId -> DBOp a -> m () - replacement in lib/Aftok/Database.hs at line 129
else void . fc $ raiseOpForbidden uid UserNotProjectMember actelse void $ raiseOpForbidden uid UserNotProjectMember act - replacement in lib/Aftok/Database.hs at line 131
addUserToProject :: ProjectId -> InvitingUID -> InvitedUID -> DBProg ()addUserToProject :: (MonadDB m) => ProjectId -> InvitingUID -> InvitedUID -> m () - replacement in lib/Aftok/Database.hs at line 135
createInvitation :: ProjectId -> InvitingUID -> Email -> C.UTCTime -> DBProg InvitationCodecreateInvitation :: (MonadDB m) => ProjectId -> InvitingUID -> Email -> C.UTCTime -> m InvitationCode - replacement in lib/Aftok/Database.hs at line 139
findInvitation :: InvitationCode -> DBProg (Maybe Invitation)findInvitation ic = fc $ FindInvitation icfindInvitation :: (MonadDB m) => InvitationCode -> m (Maybe Invitation)findInvitation ic = liftdb $ FindInvitation ic - replacement in lib/Aftok/Database.hs at line 142
acceptInvitation :: UserId -> C.UTCTime -> InvitationCode-> DBProg ()acceptInvitation :: (MonadDB m) => UserId -> C.UTCTime -> InvitationCode-> m () - replacement in lib/Aftok/Database.hs at line 148
fc $ raiseSubjectNotFound actraiseSubjectNotFound act - replacement in lib/Aftok/Database.hs at line 150
fc $ raiseOpForbidden uid InvitationExpired actraiseOpForbidden uid InvitationExpired act - replacement in lib/Aftok/Database.hs at line 152
fc $ raiseOpForbidden uid InvitationAlreadyAccepted actraiseOpForbidden uid InvitationAlreadyAccepted act - replacement in lib/Aftok/Database.hs at line 159
createEvent :: ProjectId -> UserId -> LogEntry -> DBProg EventIdcreateEvent :: (MonadDB m) => ProjectId -> UserId -> LogEntry -> m EventId - replacement in lib/Aftok/Database.hs at line 162
amendEvent :: UserId -> EventId -> EventAmendment -> DBProg AmendmentIdamendEvent :: (MonadDB m) => UserId -> EventId -> EventAmendment -> m AmendmentId - replacement in lib/Aftok/Database.hs at line 167
missing = raiseSubjectNotFound actfc $ maybe missing (\(_, uid', _) -> if uid' == uid then act else forbidden) evmissing = raiseSubjectNotFound actmaybe missing (\(_, uid', _) -> if uid' == uid then liftdb act else forbidden) ev - replacement in lib/Aftok/Database.hs at line 170
findEvent :: EventId -> DBProg (Maybe KeyedLogEntry)findEvent = fc . FindEventfindEvent :: (MonadDB m) => EventId -> m (Maybe KeyedLogEntry)findEvent = liftdb . FindEvent - replacement in lib/Aftok/Database.hs at line 173
findEvents :: ProjectId -> UserId -> Interval' -> DBProg [LogEntry]findEvents p u i = fc $ FindEvents p u ifindEvents :: (MonadDB m) => ProjectId -> UserId -> Interval' -> m [LogEntry]findEvents p u i = liftdb $ FindEvents p u i - replacement in lib/Aftok/Database.hs at line 176
readWorkIndex :: ProjectId -> UserId -> DBProg WorkIndexreadWorkIndex :: (MonadDB m) => ProjectId -> UserId -> m WorkIndex - replacement in lib/Aftok/Database.hs at line 181
createBillable :: UserId -> Billable -> DBProg BillableIdcreateBillable :: (MonadDB m) => UserId -> Billable -> m BillableId - replacement in lib/Aftok/Database.hs at line 185
readBillable :: BillableId -> DBProg (Maybe Billable)readBillable = fc . ReadBillablereadBillable :: (MonadDB m) => BillableId -> m (Maybe Billable)readBillable = liftdb . ReadBillable - replacement in lib/Aftok/Database.hs at line 188
--createPaymentRequest :: BillableId -> DBProg PaymentRequestId--createPaymentRequest bid = do-- billable <- readBillable bidfindSubscriptions :: (MonadDB m)=> UserId-> ProjectId-> m [(SubscriptionId, Subscription' Billable)]findSubscriptions uid pid = dosubscriptions <- liftdb $ FindSubscriptions uid pidlet sub'' s = sequenceA <$> traverse readBillable ssub' (sid, s) = fmap (fmap (sid,)) (sub'' s)catMaybes <$> traverse sub' subscriptions - replacement in lib/Aftok/Database.hs at line 198
readPaymentHistory :: UserId -> DBProg [Payment]readPaymentHistory :: (MonadDB m) => UserId -> m [Payment] - replacement in lib/Aftok/Database.hs at line 203
createAuction :: Auction -> DBProg AuctionIdcreateAuction :: (MonadDB m) => Auction -> m AuctionId - replacement in lib/Aftok/Database.hs at line 207
findAuction :: AuctionId -> UserId -> DBProg (Maybe Auction)findAuction :: (MonadDB m) => AuctionId -> UserId -> m (Maybe Auction) - replacement in lib/Aftok/Database.hs at line 211
maybeAuc <- fc findOpmaybeAuc <- liftdb findOp - replacement in lib/Aftok/Database.hs at line 215
findAuction' :: AuctionId -> UserId -> DBProg AuctionfindAuction' :: (MonadDB m) => AuctionId -> UserId -> m Auction - replacement in lib/Aftok/Database.hs at line 219
maybeAuc <- fc findOpmaybeAuc <- liftdb findOp - replacement in lib/Aftok/Database.hs at line 221
maybe (fc $ raiseSubjectNotFound findOp) pure maybeAucmaybe (raiseSubjectNotFound findOp) pure maybeAuc - replacement in lib/Aftok/Database.hs at line 223
createBid :: AuctionId -> UserId -> Bid -> DBProg BidIdcreateBid :: (MonadDB m) => AuctionId -> UserId -> Bid -> m BidId - replacement in lib/Aftok/Database.hs at line 228
fc $ if view bidTime bid > view auctionEnd aucif view bidTime bid > view auctionEnd auc - replacement in lib/Aftok/Database.hs at line 230
else createOp[3.756]else liftdb createOp - edit in lib/Aftok/Json.hs at line 4
{-# LANGUAGE TypeApplications #-} - edit in lib/Aftok/Json.hs at line 33
import Aftok.Time - edit in lib/Aftok/Json.hs at line 181
, "amount" .= (b ^. (B.amount . satoshi)), "gracePeriod" .= (b ^. (B.gracePeriod . _Days)), "requestExpiryPeriod" .= (C.toSeconds' <$> (b ^. B.requestExpiryPeriod)) - replacement in lib/Aftok/Json.hs at line 193[3.5682]→[3.2237:2289](∅→∅),[3.2289]→[2.1925:1957](∅→∅),[2.1957]→[3.2322:2422](∅→∅),[3.2322]→[3.2322:2422](∅→∅)
subscriptionJSON :: UserId -> B.BillableId -> ValuesubscriptionJSON uid bid = v1 $obj [ "userId" .= tshow (uid ^. _UserId), "billableId" .= tshow (bid ^. B._BillableId)createSubscriptionJSON :: UserId -> B.Subscription -> ValuecreateSubscriptionJSON uid sub = v1 $obj [ "user_id" .= tshow (uid ^. _UserId), "billable_id" .= tshow (sub ^. (B.billable . B._BillableId)) - file addition: Payments[3.679]
- file addition: Types.hs[0.10523]
{-# LANGUAGE TemplateHaskell #-}module Aftok.Payments.Types whereimport ClassyPreludeimport Control.Lens (makeLenses, makePrisms)import Data.Thyme.Clock as Cimport Data.UUIDimport qualified Network.Bippy.Proto as Pimport Aftok.Billables (SubscriptionId)newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq)makePrisms ''PaymentRequestIdnewtype PaymentId = PaymentId UUID deriving (Show, Eq)makePrisms ''PaymentIddata PaymentRequest' s = PaymentRequest{ _subscription :: s, _paymentRequest :: P.PaymentRequest, _paymentRequestDate :: C.UTCTime}makeLenses ''PaymentRequest'type PaymentRequest = PaymentRequest' SubscriptionIddata Payment' r = Payment{ _request :: r, _payment :: P.Payment, _paymentDate :: C.UTCTime}makeLenses ''Payment'type Payment = Payment' PaymentRequestId - edit in lib/Aftok/Payments.hs at line 2
{-# LANGUAGE FlexibleContexts #-} - replacement in lib/Aftok/Payments.hs at line 4
module Aftok.Payments wheremodule Aftok.Payments( module Aftok.Payments, module Aftok.Payments.Types) where - replacement in lib/Aftok/Payments.hs at line 11
import Control.Lens (makeLenses, makePrisms)import Control.Lens (makeLenses, view, (%~), (^.))import Control.Lens.Tupleimport Control.Monad.Except (MonadError)import Crypto.PubKey.RSA.Types (Error(..), PrivateKey)import Crypto.Random.Types (MonadRandom) - edit in lib/Aftok/Payments.hs at line 17
import Data.AffineSpace ((.+^))import Data.Map.Strict (assocs) - replacement in lib/Aftok/Payments.hs at line 20
import Data.UUIDimport Data.Thyme.Time.Core (fromThyme) - edit in lib/Aftok/Payments.hs at line 22
import qualified Network.Bippy as B - edit in lib/Aftok/Payments.hs at line 24
import qualified Network.Bippy.Types as BTimport Network.Haskoin.Script (ScriptOutput(..))import Network.URI - edit in lib/Aftok/Payments.hs at line 28
import Aftok (UserId, BtcAddr(..), userAddress, _BtcAddr)import Aftok.Database - edit in lib/Aftok/Payments.hs at line 31
import Aftok.Payments.Typesimport Aftok.Project (ProjectId, depf)import qualified Aftok.TimeLog as TLimport Aftok.Types (satoshi)data BillingConfig = BillingConfig{ _network :: BT.Network, _signingKey :: PrivateKey, _pkiData :: BT.PKIData}makeLenses ''BillingConfigcreatePaymentRequests :: (MonadRandom m, MonadReader BillingConfig m, MonadError Error m, MonadDB m) =>C.UTCTime -- timestamp for payment request creation-> (Subscription' Billable -> m (Maybe Text)) -- generator user memo-> (Subscription' Billable -> m (Maybe URI)) -- generator for payment response URL-> (Subscription' Billable -> m (Maybe ByteString)) -- generator for merchant payload-> UserId -- user responsible for payment-> ProjectId -- project whose worklog is to be paid out to-> m [PaymentRequestId]createPaymentRequests t memogen urigen plgen custId pid = dosubscriptions <- findSubscriptions custId pidcfg <- asklet createPaymentDetails' s = domemo <- memogen suri <- urigen spayload <- plgen screatePaymentDetails t memo uri payload (s ^. billable) - replacement in lib/Aftok/Payments.hs at line 61
newtype PaymentRequestId = PaymentRequestId UUID deriving (Show, Eq)makePrisms ''PaymentRequestIdcreatePaymentRequest (sid, s) = dodetails <- createPaymentDetails' sreq <- B.createPaymentRequest (cfg ^. signingKey) (cfg ^. pkiData) detailsliftdb $ CreatePaymentRequest custId (PaymentRequest sid req t)traverse createPaymentRequest subscriptionscreatePaymentDetails :: (MonadRandom m, MonadReader BillingConfig m, MonadDB m) =>C.UTCTime -- timestamp for payment request creation-> Maybe Text -- user memo-> Maybe URI -- payment response URL-> Maybe ByteString -- merchant payload-> Billable-> m P.PaymentDetailscreatePaymentDetails t memo uri payload b = dopayouts <- getProjectPayouts t (b ^. project)outputs <- createPayoutsOutputs t (b ^. amount) payoutslet expiry = (BT.Expiry . fromThyme . (t .+^)) <$> (b ^. requestExpiryPeriod)cfg <- askpure $ B.createPaymentDetails (cfg ^. network) outputs (fromThyme t) expiry memo uri payloadgetProjectPayouts :: (MonadDB m) => C.UTCTime -> ProjectId -> m TL.PayoutsgetProjectPayouts ptime pid = doproject' <-let projectOp = FindProject pidin maybe (raiseSubjectNotFound projectOp) pure =<< liftdb projectOpwidx <- liftdb $ ReadWorkIndex pidpure $ TL.payouts (TL.toDepF $ project' ^. depf) ptime widxcreatePayoutsOutputs :: (MonadDB m) => C.UTCTime -> BT.Satoshi -> TL.Payouts -> m [BT.Output]createPayoutsOutputs t amt p =let payoutFractions :: [(TL.CreditTo, BT.Satoshi)]payoutFractions = (_2 %~ outputAmount amt) <$> assocs (p ^. TL._Payouts)in join <$> traverse (uncurry (createOutputs t)) payoutFractions - replacement in lib/Aftok/Payments.hs at line 100
newtype PaymentId = PaymentId UUID deriving (Show, Eq)makePrisms ''PaymentIdcreateOutputs :: (MonadDB m) => C.UTCTime -> TL.CreditTo -> BT.Satoshi -> m [BT.Output]createOutputs _ (TL.CreditToAddress (BtcAddr addr)) amt =pure $ [BT.Output amt (PayPKHash addr)] - replacement in lib/Aftok/Payments.hs at line 104[3.6086]→[3.1263:1303](∅→∅),[3.1303]→[2.2353:2426](∅→∅),[2.2426]→[3.6199:6236](∅→∅),[3.6199]→[3.6199:6236](∅→∅),[3.6255]→[3.6255:6259](∅→∅),[3.6259]→[3.715:744](∅→∅)
data PaymentRequest' s = PaymentRequest{ _subscription :: s, _paymentRequest :: P.PaymentRequest, _paymentRequestDate :: C.UTCTime}makeLenses ''PaymentRequest'createOutputs _ (TL.CreditToUser uid) amt = doaddrMay <- (>>= view userAddress) <$> findUser uidlet createOutput addr = BT.Output amt (PayPKHash (addr ^. _BtcAddr))pure . maybeToList $ createOutput <$> addrMay - replacement in lib/Aftok/Payments.hs at line 109
type PaymentRequest = PaymentRequest' SubscriptionIdcreateOutputs t (TL.CreditToProject pid) amt = dopayouts <- getProjectPayouts t pidcreatePayoutsOutputs t amt payouts - edit in lib/Aftok/Payments.hs at line 113[3.799]→[3.1304:1330](∅→∅),[3.1330]→[2.2427:2479](∅→∅),[2.2479]→[3.6359:6389](∅→∅),[3.6359]→[3.6359:6389](∅→∅),[3.6405]→[3.6405:6409](∅→∅),[3.6409]→[3.833:855](∅→∅)
data Payment' r = Payment{ _request :: r, _payment :: P.Payment, _paymentDate :: C.UTCTime}makeLenses ''Payment' - replacement in lib/Aftok/Payments.hs at line 114
type Payment = Payment' PaymentRequestId[3.856]outputAmount :: BT.Satoshi -> Rational -> BT.SatoshioutputAmount i r = BT.Satoshi . round $ toRational (i ^. satoshi) * r - edit in lib/Aftok/Project.hs at line 8
import Crypto.Random.Types (MonadRandom, getRandomBytes) - edit in lib/Aftok/Project.hs at line 13
import OpenSSL.Random - edit in lib/Aftok/Project.hs at line 20
- replacement in lib/Aftok/Project.hs at line 32
randomInvCode :: IO InvitationCoderandomInvCode = InvitationCode <$> randBytes 32randomInvCode :: (MonadRandom m) => m InvitationCoderandomInvCode = InvitationCode <$> getRandomBytes 32 - replacement in lib/Aftok/TimeLog.hs at line 120
workCredit :: (Functor f, Foldable f) => DepF -> C.UTCTime -> f Interval -> NDTworkCredit :: (Foldable f) => DepF -> C.UTCTime -> f Interval -> NDT - replacement in lib/Aftok/TimeLog.hs at line 130
let addIntervalDiff :: (Functor f, Foldable f) => NDT -> f Interval -> (NDT, NDT)let addIntervalDiff :: (Foldable f) => NDT -> f Interval -> (NDT, NDT) - edit in lib/Aftok/Util.hs at line 1
{-# LANGUAGE GeneralizedNewtypeDeriving #-} - replacement in lib/Aftok/Util.hs at line 11
type Program f a = F (Coyoneda f) anewtype Program (f :: * -> *) (a :: *) = Program{ runProgram :: F (Coyoneda f) a }deriving (Functor, Applicative, Monad) - replacement in lib/Aftok/Util.hs at line 19
in iterM eval pin iterM eval (runProgram p) - replacement in lib/Aftok/Util.hs at line 22
fc = liftF . liftCoyonedafc = Program . liftF . liftCoyoneda - replacement in migrations/2016-12-31_03-45-17_create-payments.txt at line 49
event_id uuid not null references aftok_events(id)event_id uuid not null references aftok_events(id),start_date date not null,end_date date null - edit in server/Aftok/QConfig.hs at line 1
{-# LANGUAGE TypeApplications #-} - edit in server/Aftok/QConfig.hs at line 9
import qualified Network.Bippy.Types as B - edit in server/Aftok/QConfig.hs at line 26
, btcConfig :: BtcConfig - edit in server/Aftok/QConfig.hs at line 37
data BtcConfig = BtcConfig{ btcNetwork :: B.Network } - edit in server/Aftok/QConfig.hs at line 55
<*> readBtcConfig cfg - replacement in server/Aftok/QConfig.hs at line 65
baseSnapConfig :: MonadSnap m => QConfig -> SC.Config m a -> SC.Config m areadBtcConfig :: CT.Config -> IO BtcConfigreadBtcConfig cfg =let parseNetwork :: String -> B.NetworkparseNetwork "main" = B.MainNetparseNetwork _ = B.TestNetin (BtcConfig . parseNetwork) <$> C.require cfg "network"baseSnapConfig :: QConfig -> SC.Config m a -> SC.Config m a - edit in server/Aftok/QConfig.hs at line 82[3.6294]
- replacement in server/Aftok/Snaplet/Auctions.hs at line 22
import Aftok.Snapletimport Aftok.Snaplet as S - replacement in server/Aftok/Snaplet/Auctions.hs at line 25
import Snapimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Auctions.hs at line 41
auctionCreateHandler :: Handler App App AuctionIdauctionCreateHandler :: S.Handler App App AuctionId - replacement in server/Aftok/Snaplet/Auctions.hs at line 51
auctionGetHandler :: Handler App App AuctionauctionGetHandler :: S.Handler App App Auction - replacement in server/Aftok/Snaplet/Auctions.hs at line 58
auctionBidHandler :: Handler App App BidIdauctionBidHandler :: S.Handler App App BidId - replacement in server/Aftok/Snaplet/Auth.hs at line 17
import Snap.Snapletimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Auth.hs at line 20
requireLogin :: Handler App App AU.AuthUserrequireLogin :: S.Handler App App AU.AuthUser - replacement in server/Aftok/Snaplet/Auth.hs at line 28
requireUser :: Handler App App AU.AuthUserrequireUser :: S.Handler App App AU.AuthUser - replacement in server/Aftok/Snaplet/Auth.hs at line 33
requireUserId :: Handler App App UserIdrequireUserId :: S.Handler App App UserId - replacement in server/Aftok/Snaplet/Payments.hs at line 11
requestPaymentHandler :: Handler App ApprequestPaymentHandler = doimport Aftok.QConfigrequestPaymentHandler :: QConfig -> Handler App ApprequestPaymentHandler cfg = do - replacement in server/Aftok/Snaplet/Payments.hs at line 19
payouts <- snapEval $ fc (ReadWorkIndex pid)pure $ payouts (toDepF $ project ^. depf) ptime widx-- look up the outstandingwidx <- snapEval $ fc (ReadWorkIndex pid)-- look up outstanding subscriptions the user has for this project-- determine which subscriptions need to be paid-- create a payment request for each subscription - edit in server/Aftok/Snaplet/Payments.hs at line 24
- edit in server/Aftok/Snaplet/Payments.hs at line 27[3.10308]
- replacement in server/Aftok/Snaplet/Projects.hs at line 30
import Snap.Snapletimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Projects.hs at line 38
projectCreateHandler :: Handler App App ProjectIdprojectCreateHandler :: S.Handler App App ProjectId - replacement in server/Aftok/Snaplet/Projects.hs at line 46
projectListHandler :: Handler App App [KeyedProject]projectListHandler :: S.Handler App App [KeyedProject] - replacement in server/Aftok/Snaplet/Projects.hs at line 51
projectGetHandler :: Handler App App ProjectprojectGetHandler :: S.Handler App App Project - replacement in server/Aftok/Snaplet/Projects.hs at line 58
projectInviteHandler :: QConfig -> Handler App App ()projectInviteHandler :: QConfig -> S.Handler App App () - replacement in server/Aftok/Snaplet/Users.hs at line 22
import Snap.Snapletimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/Users.hs at line 49
registerHandler :: Handler App App UserIdregisterHandler :: S.Handler App App UserId - replacement in server/Aftok/Snaplet/Users.hs at line 63
acceptInvitationHandler :: Handler App App ()acceptInvitationHandler :: S.Handler App App () - replacement in server/Aftok/Snaplet/WorkLog.hs at line 23
import Snap.Snapletimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet/WorkLog.hs at line 25
logWorkHandler :: (C.UTCTime -> LogEvent) -> Handler App App EventIdlogWorkHandler :: (C.UTCTime -> LogEvent) -> S.Handler App App EventId - replacement in server/Aftok/Snaplet/WorkLog.hs at line 35
logWorkBTCHandler :: (C.UTCTime -> LogEvent) -> Handler App App EventIdlogWorkBTCHandler :: (C.UTCTime -> LogEvent) -> S.Handler App App EventId - replacement in server/Aftok/Snaplet/WorkLog.hs at line 49
loggedIntervalsHandler :: Handler App App WorkIndexloggedIntervalsHandler :: S.Handler App App WorkIndex - replacement in server/Aftok/Snaplet/WorkLog.hs at line 55
logEntriesHandler :: Handler App App [LogEntry]logEntriesHandler :: S.Handler App App [LogEntry] - replacement in server/Aftok/Snaplet/WorkLog.hs at line 67
payoutsHandler :: Handler App App PayoutspayoutsHandler :: S.Handler App App Payouts - replacement in server/Aftok/Snaplet/WorkLog.hs at line 77
amendEventHandler :: Handler App App AmendmentIdamendEventHandler :: S.Handler App App AmendmentId - replacement in server/Aftok/Snaplet.hs at line 21
import Snap.Snapletimport Snap.Snaplet as S - replacement in server/Aftok/Snaplet.hs at line 33
instance HasPostgres (Handler b App) whereinstance HasPostgres (S.Handler b App) where - replacement in server/Aftok/Snaplet.hs at line 37
snapEval :: (MonadSnap m, HasPostgres m) => DBProg a -> m asnapEval :: (MonadSnap m, HasPostgres m) => Program DBOp a -> m a - replacement in server/Aftok/Snaplet.hs at line 46
e <- liftPG $ \conn -> runEitherT (runQDBM conn $ interpret dbEval p)e <- liftPG $ \conn -> liftIO $ runEitherT (runQDBM conn $ interpret liftdb p) - replacement in server/Aftok/Snaplet.hs at line 70
readRequestJSON :: MonadSnap m => Int64 -> m A.ValuereadRequestJSON i = dorequestBody <- A.decode <$> readRequestBody ireadRequestJSON :: MonadSnap m => Word64 -> m A.ValuereadRequestJSON len = dorequestBody <- A.decode <$> readRequestBody len - replacement in server/Main.hs at line 35
initCookieSessionManager (authSiteKey cfg) "quookie" (cookieTimeout cfg)initCookieSessionManager (authSiteKey cfg) "quookie" (Just "aftok.com") (cookieTimeout cfg) - file addition: stack-deps.yaml[76.2]
---- Boolean-0.2.3- HUnit-1.3.1.2- MemoTrie-0.6.4- MonadRandom-0.4.2.3- NumInstances-1.4- QuickCheck-2.8.2- RSA-2.2.0- ReadArgs-1.2.3- SHA-1.6.4.2- StateVar-1.1.0.4- adjunctions-4.3- aeson-0.11.2.1- aftok-0.1- ansi-terminal-0.6.2.3- ansi-wl-pprint-0.6.7.3- array-0.5.1.1- asn1-encoding-0.9.4- asn1-parse-0.9.4- asn1-types-0.3.2- async-2.1.1- attoparsec-0.13.1.0- authenticate-oauth-1.5.1.2- base-4.9.0.0- base-orphans-0.5.4- base16-bytestring-0.1.1.6- base64-bytestring-1.0.0.1- basic-prelude-0.6.1- bifunctors-5.4.1- binary-0.8.3.0- bippy-0.1.0.0- blaze-builder-0.4.0.2- blaze-html-0.8.1.3- blaze-markup-0.7.1.1- byteable-0.1.1- bytedump-1.0- bytestring-0.10.8.1- bytestring-builder-0.10.8.1.0- case-insensitive-1.2.0.7- cereal-0.5.4.0- chunked-data-0.3.0- cipher-aes-0.2.11- classy-prelude-1.0.2- clientsession-0.9.1.2- clock-0.7.2- comonad-5- conduit-1.2.8- configurator-0.3.0.0- connection-0.2.6- constraints-0.8- containers-0.5.7.1- contravariant-1.4- cookie-0.4.2.1- cprng-aes-0.6.1- crypto-api-0.13.2- crypto-cipher-types-0.0.9- crypto-pubkey-types-0.4.3- crypto-random-0.0.9- cryptohash-0.11.9- cryptohash-md5-0.11.100.1- cryptohash-sha1-0.11.100.1- cryptonite-0.21- data-binary-ieee754-0.4.4- data-default-0.7.1.1- data-default-class-0.1.2.0- data-default-instances-containers-0.0.1- data-default-instances-dlist-0.0.1- data-default-instances-old-locale-0.0.1- deepseq-1.4.2.0- directory-1.2.6.2- directory-tree-0.12.1- distributive-0.5.1- dlist-0.8.0.2- dlist-instances-0.1.1.1- either-4.4.1.1- entropy-0.3.7- errors-2.1.3- exceptions-0.8.3- fail-4.9.0.0- filepath-1.4.1.0- free-4.12.4- ghc-prim-0.5.0.0- groups-0.4.0.0- hashable-1.2.4.0- haskoin-core-0.4.0- heaps-0.3.3- heist-1.0.1.0- hourglass-0.2.10- http-client-0.4.31.2- http-client-tls-0.2.4.1- http-types-0.9.1- integer-gmp-1.0.0.1- io-streams-1.3.6.0- io-streams-haproxy-1.0.0.1- iso8601-time-0.1.4- kan-extensions-5.0.1- keys-3.11- largeword-1.2.5- lens-4.14- lens-aeson-1.0.0.5- lifted-async-0.9.1- lifted-base-0.2.3.8- map-syntax-0.2.0.1- memory-0.13- mime-mail-0.4.12- mime-types-0.1.0.7- mmorph-1.0.9- monad-control-1.0.1.0- monad-unlift-0.2.0- mono-traversable-1.0.1- mono-traversable-instances-0.1.0.0- mtl-2.2.1- murmur3-1.0.3- mutable-containers-0.3.3- mwc-random-0.13.5.0- network-2.6.3.1- network-info-0.2.0.8- network-uri-2.6.1.0- old-locale-1.0.0.7- optparse-applicative-0.12.1.0- parallel-3.2.1.0- parsec-3.1.11- pbkdf-1.1.1.1- pem-0.2.2- pointed-5- postgresql-libpq-0.9.3.0- postgresql-simple-0.5.2.1- prelude-extras-0.4.0.3- primitive-0.6.1.0- process-1.4.2.0- profunctors-5.2- protobuf-0.2.1.1- psqueues-0.2.2.3- pureMD5-2.1.3- pwstore-fast-2.4.4- random-1.1- readable-0.3.1- reflection-2.1.2- regex-base-0.93.2- regex-posix-0.95.2- resource-pool-0.2.3.2- resourcet-1.1.9- safe-0.3.10- safe-exceptions-0.1.4.0- say-0.1.0.0- scientific-0.3.4.9- secp256k1-0.4.6- securemem-0.1.9- semigroupoids-5.1- semigroups-0.18.2- setenv-0.1.1.3- skein-1.0.9.4- smtp-mail-0.1.4.6- snap-1.0.0.1- snap-core-1.0.1.0- snap-server-1.0.1.1- snaplet-postgresql-simple-1.0.1.0- socks-0.5.5- split-0.2.3.1- stm-2.4.4.1- stm-chans-3.0.0.4- streaming-commons-0.1.16- string-conversions-0.4.0.1- syb-0.6- system-filepath-0.4.13.4- tagged-0.8.5- template-haskell-2.11.0.0- text-1.2.2.1- tf-random-0.5- thyme-0.3.5.5- time-1.6.0.1- time-locale-compat-0.1.1.3- tls-1.3.9- transformers-0.5.2.0- transformers-base-0.4.4- transformers-compat-0.5.1.4- unexceptionalio-0.3.0- unix-2.7.2.0- unix-compat-0.4.3.1- unordered-containers-0.2.7.2- utf8-string-1.0.1.1- uuid-1.3.13- uuid-types-1.0.3- vector-0.11.0.0- vector-algorithms-0.7.0.1- vector-instances-3.3.1- vector-space-0.10.4- vector-th-unbox-0.2.1.6- void-0.7.1- wreq-0.4.1.0- x509-1.6.5- x509-store-1.6.2- x509-system-1.6.4- x509-validation-1.6.5- xmlhtml-0.2.3.5- zlib-0.6.1.2- zlib-bindings-0.1.1.5 - replacement in stack.yaml at line 6
commit: 6284d5fff3954e0e52d559298364035a220867afcommit: ddfc1bf0911351d0be51f33ea9e4166a24d2b19a - replacement in stack.yaml at line 10[3.10695]→[3.10695:11016](∅→∅),[3.11016]→[3.1150:1182](∅→∅),[3.1150]→[3.1150:1182](∅→∅),[3.1182]→[3.11017:11119](∅→∅),[3.11119]→[3.1182:1200](∅→∅),[3.1182]→[3.1182:1200](∅→∅)
- aeson-0.11.2.1- base-orphans-0.5.4- bytestring-builder-0.10.8.1.0- call-stack-0.1.0- haskoin-core-0.4.0- hspec-2.3.2- hspec-core-2.3.2- hspec-discover-2.3.2- hspec-expectations-0.8.2- mmorph-1.0.9- mono-traversable-0.10.2- murmur3-1.0.1- pbkdf-1.1.1.1- postgresql-libpq-0.9.2.0- postgresql-simple-0.5.2.1- resource-pool-catchio-0.2.1.0- secp256k1-0.4.5- snaplet-postgresql-simple-0.6.0.4- unix-compat-0.4.3.1- vector-th-unbox-0.2.1.6resolver: lts-5.3[3.10695]- heist-1.0.1.0- map-syntax-0.2.0.1- snap-1.0.0.1- snaplet-postgresql-simple-1.0.1.0resolver: lts-7.16