Add route to allow crediting of events to users/projects.
[?]
Oct 20, 2016, 1:47 AM
O722AOKEWXWJPRHGJREU6QPW7HEFPPRETZIAADZ2RMAXHARCNEKACDependencies
- [2]
RN7EI6INUpdate database layer to use CreditTo - [3]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [4]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [5]
IZEVQF62Work in progress replacing sqlite with postgres. - [6]
KNSI575VCleanup of EventLog types. - [7]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [8]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [9]
HALRDT2FAdded initial auction create route. - [10]
NVOCQVASInitial failing tests. - [11]
TLQ72DSJLenses, sqlite-simple - [12]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [13]
MB5SHULBAdd route for accepting an invitation with an existing account - [14]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [15]
A6HKMINBAttempting to improve JSON handling. - [16]
POX3UAMTEnabling logging of time to contributor/project accounts - [17]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [18]
ASF3UPJLAdd auction creation and bid handlers - [19]
Z3MK2PJ5Add GET handler for retrieving auction data. - [20]
EZQG2APBUpdate task list. - [21]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [22]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [23]
MGOF7IUFUpdate TASKS list to reflect completed projects. - [24]
NEDDHXUKReformat via stylish-haskell - [25]
BROSTG5KBeginning of modularization of server. - [*]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [*]
WZUHEZSBStart of migration back toward snap. - [*]
W35DDBFYFactor common JSON conversions up into client lib module. - [*]
ADMKQQGCInitial empty Snap project.
Change contents
- edit in aftok.cabal at line 118
, errors - replacement in lib/Aftok/Json.hs at line 63
verstr <- v .: "schemaVersion"vers <- either fail pure $ PC.parseOnly versionParser (encodeUtf8 verstr)verstr <- v .: "schemaVersion"vers <- either fail pure $ PC.parseOnly versionParser (encodeUtf8 verstr) - edit in lib/Aftok/Json.hs at line 149
logEventJSON :: LogEvent -> ValuelogEventJSON ev = object [ eventName ev .= object [ "eventTime" .= (ev ^. eventTime) ] ] - replacement in lib/Aftok/Json.hs at line 156
, "eventType" .= eventName ev, "eventTime" .= (ev ^. eventTime), "event" .= logEventJSON ev - edit in lib/Aftok/Json.hs at line 213[3.6407]→[3.3236:3322](∅→∅),[3.3322]→[2.4621:4676](∅→∅),[2.4676]→[3.3376:3478](∅→∅),[3.3376]→[3.3376:3478](∅→∅),[3.3478]→[2.4677:4678](∅→∅)
parseCreditTo :: Value -> Parser CreditToparseCreditTo = unversion $ \x -> case x ofVersion 1 0 -> withObject "BtcAddr" parseCreditToV1Version 2 0 -> withObject "CreditTo" parseCreditToV2_ -> badVersion "EventAmendment" x - edit in lib/Aftok/Json.hs at line 218
parseCreditTo :: Value -> Parser CreditToparseCreditTo = unversion $ \v -> case v ofVersion 1 0 -> withObject "BtcAddr" parseCreditToV1Version 2 0 -> withObject "CreditTo" parseCreditToV2_ -> badVersion "EventAmendment" v - edit in lib/Aftok/Json.hs at line 249[3.4290]
parseLogEvent :: Object -> Parser LogEventparseLogEvent x =(StartWork <$> x .: "start") <|> (StopWork <$> x .: "stop")parseLogEntry :: Value -> Parser LogEntryparseLogEntry = unversion parseLogEntry' whereparseLogEntry' (Version 2 0) (Object x) =LogEntry <$> (x .: "creditTo" >>= parseCreditTo)<*> (x .: "event" >>= parseLogEvent)<*> (x .: "eventMeta")parseLogEntry' v x = badVersion "LogEntry" v x - replacement in lib/Aftok/TimeLog.hs at line 54
nameEvent "start" = return StartWorknameEvent "stop" = return StopWorknameEvent "start" = pure StartWorknameEvent "stop" = pure StopWork - replacement in server/Aftok/Snaplet/WorkLog.hs at line 11
import Aftokimport Aftok (parseBtcAddr) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 36
snapEval $ createEvent pid uid (LogEntry addr (evCtr timestamp) (A.decode requestBody))snapEval . createEvent pid uid $LogEntry (CreditToAddress addr) (evCtr timestamp) (A.decode requestBody)recordLogEntryHandler :: Handler App App EventIdrecordLogEntryHandler = douid <- requireUserIdpid <- requireProjectIdrequestBody <- readRequestBody 4096timestamp <- liftIO C.getCurrentTimecase A.eitherDecode requestBody >>= parseEither parseLogEntry ofLeft err -> snapError 400 $ "Unable to parse log entry " <> (tshow requestBody) <> ": " <> tshow errRight entry -> snapEval $ createEvent pid uid (event.eventTime .~ timestamp $ entry) - replacement in server/Main.hs at line 39
let loginRoute = requireLogin >> redirect "/home"registerRoute = void $ method POST registerHandleracceptInviteRoute = void $ method POST acceptInvitationHandlerlet loginRoute = requireLogin >> redirect "/home"registerRoute = void $ method POST registerHandleracceptInviteRoute = void $ method POST acceptInvitationHandler - replacement in server/Main.hs at line 43
projectCreateRoute = serveJSON projectIdJSON $ method POST projectCreateHandlerlistProjectsRoute = serveJSON (fmap qdbProjectJSON) $ method GET projectListHandlerprojectCreateRoute = serveJSON projectIdJSON $ method POST projectCreateHandlerlistProjectsRoute = serveJSON (fmap qdbProjectJSON) $ method GET projectListHandler - replacement in server/Main.hs at line 46[3.2398]→[3.12739:12819](∅→∅),[3.12819]→[3.1665:1747](∅→∅),[3.1747]→[3.3245:3333](∅→∅),[3.2480]→[3.3245:3333](∅→∅),[3.3333]→[3.1634:1721](∅→∅),[3.1721]→[3.12820:12970](∅→∅),[3.7876]→[3.12820:12970](∅→∅)
projectRoute = serveJSON projectJSON $ method GET projectGetHandlerlogEventRoute f = serveJSON eventIdJSON $ method POST (logWorkHandler f)logEntriesRoute = serveJSON (fmap logEntryJSON) $ method GET logEntriesHandlerlogIntervalsRoute = serveJSON workIndexJSON $ method GET loggedIntervalsHandlerpayoutsRoute = serveJSON payoutsJSON $ method GET payoutsHandlerinviteRoute = void . method POST $ projectInviteHandler cfgprojectRoute = serveJSON projectJSON $ method GET projectGetHandlerlogWorkRoute f = serveJSON eventIdJSON $ method POST (logWorkHandler f)recordLogEntryRoute = serveJSON eventIdJSON $ method POST recordLogEntryHandlerlogEntriesRoute = serveJSON (fmap logEntryJSON) $ method GET logEntriesHandlerlogIntervalsRoute = serveJSON workIndexJSON $ method GET loggedIntervalsHandlerpayoutsRoute = serveJSON payoutsJSON $ method GET payoutsHandlerinviteRoute = void . method POST $ projectInviteHandler cfg - replacement in server/Main.hs at line 54[3.12971]→[3.1748:1834](∅→∅),[3.1834]→[3.1722:1802](∅→∅),[3.4230]→[3.1722:1802](∅→∅),[3.1802]→[3.1835:1914](∅→∅)
auctionCreateRoute = serveJSON auctionIdJSON $ method POST auctionCreateHandlerauctionRoute = serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandlerauctionCreateRoute = serveJSON auctionIdJSON $ method POST auctionCreateHandlerauctionRoute = serveJSON auctionJSON $ method GET auctionGetHandlerauctionBidRoute = serveJSON bidIdJSON $ method POST auctionBidHandler - replacement in server/Main.hs at line 58
amendEventRoute = serveJSON amendmentIdJSON $ method PUT amendEventHandleramendEventRoute = serveJSON amendmentIdJSON $ method PUT amendEventHandler - replacement in server/Main.hs at line 68[3.3549]→[3.2968:3049](∅→∅),[3.8018]→[3.2968:3049](∅→∅),[3.13135]→[3.2968:3049](∅→∅),[3.2968]→[3.2968:3049](∅→∅),[3.3049]→[3.11924:12004](∅→∅)
, ("projects/:projectId/logStart/:btcAddr", logEventRoute StartWork), ("projects/:projectId/logEnd/:btcAddr", logEventRoute StopWork), ("projects/:projectId/logStart/:btcAddr", logWorkRoute StartWork), ("projects/:projectId/logEnd/:btcAddr", logWorkRoute StopWork), ("projects/:projectId/logWorkEvent", recordLogEntryRoute)