Undo JSON silliness, enable a couple more routes.
[?]
May 7, 2015, 5:40 AM
O5FVTOM6YFBLEPF3S576K6IMT6ZZ5VQCSB3YVXNS4CKBITKCRZ7ACDependencies
- [2]
KNSI575VCleanup of EventLog types. - [3]
NVOCQVASInitial failing tests. - [4]
BROSTG5KBeginning of modularization of server. - [5]
5DRIWGLUImproving TimeLog specs - [6]
N4NDAZYTInitial implementation of payouts. - [7]
W35DDBFYFactor common JSON conversions up into client lib module. - [8]
Z7KS5XHHVery WIP. Wow. - [9]
EZQG2APBUpdate task list. - [10]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [11]
I2KHGVD4Require project permissions for access to most data. - [12]
7DBNV3GVInitial, stack-based impl of time log event reduction. - [13]
2OIPAQCBMerge branch 'master' of github.com:nuttycom/ananke - [14]
VJPT6HDRFix remaining type errors after addition of login handler. - [15]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [16]
P6NR2CGXBeginning of implementation of depreciation. - [17]
TNR3TEHKSwitch to Postgres + snaplet arch compiles. - [18]
2G3GNDDUEvent logging is now functioning in postgres. - [19]
4IQVQL4TAdded client for payouts endpoint. - [20]
RSEB2NFGReplacing Snap with Scotty. - [21]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [22]
Z3M53KTLAdrift. - [23]
LD4GLVSFMore database stuff. - [24]
4QX5E5ACInitial compilation of payouts function succeeds. - [25]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [26]
7XN3I3QJAdd 'loggedIntervals' endpoint. - [27]
5XFJNUAZStart of addition of project infrastructure. - [28]
A6HKMINBAttempting to improve JSON handling. - [29]
2Y2QZFVFSwitch to more modern cabal2nix-based workflow. - [30]
PBD7LZYQPostgres & auth are beginning to function. - [31]
IZEVQF62Work in progress replacing sqlite with postgres. - [32]
XTBSG4C7Adding serveJSON combinator to eliminate some boilerplate from handlers. - [33]
TLQ72DSJLenses, sqlite-simple - [34]
EMVTF2IWWIP moving back to snap. - [35]
SLL7262CMake depreciation functions more flexible. - [*]
HE3JTXO3Added client call to payouts. - [*]
ADMKQQGCInitial empty Snap project.
Change contents
- edit in lib/Quixotic/Client.hs at line 8
import Data.Aeson.Types - edit in lib/Quixotic/Client.hs at line 13
import Quixotic.Json - replacement in lib/Quixotic/Client.hs at line 27
payoutsResponse <- asJSON resppure $ payoutsResponse ^. responseBodyvalueResponse <- asValue respeither fail pure (parseEither parsePayoutsJSON $ valueResponse ^. responseBody) - edit in lib/Quixotic/Database/PostgreSQL.hs at line 134
newtype PProject = PProject { pProject :: Project }instance FromRow PProject wherefromRow = PProject <$> projectRowParser - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 152
recordEvent' :: ProjectId -> UserId -> LogEntry -> QDBM EventIdrecordEvent' (ProjectId pid) (UserId uid) (LogEntry a e m) = docreateEvent' :: ProjectId -> UserId -> LogEntry -> QDBM EventIdcreateEvent' (ProjectId pid) (UserId uid) (LogEntry a e m) = do - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 189
newAuction' :: ProjectId -> Auction -> QDBM AuctionIdnewAuction' pid auc = docreateAuction' :: ProjectId -> Auction -> QDBM AuctionIdcreateAuction' pid auc = do - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 196
readAuction' :: AuctionId -> QDBM (Maybe Auction)readAuction' aucId = dofindAuction' :: AuctionId -> QDBM (Maybe Auction)findAuction' aucId = do - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 203
recordBid' :: AuctionId -> Bid -> QDBM ()recordBid' (AuctionId aucId) bid = docreateBid' :: AuctionId -> Bid -> QDBM ()createBid' (AuctionId aucId) bid = do - edit in lib/Quixotic/Database/PostgreSQL.hs at line 253
findProject' :: ProjectId -> QDBM (Maybe Project)findProject' (ProjectId pid) = doprojects <- pquery"SELECT project_name, inception_date, initiator_id FROM projects WHERE id = ?"(Only pid)pure . fmap pProject $ headMay projects - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 272
{ recordEvent = recordEvent'{ createEvent = createEvent' - replacement in lib/Quixotic/Database/PostgreSQL.hs at line 275
, newAuction = newAuction', readAuction = readAuction', recordBid = recordBid', createAuction = createAuction', findAuction = findAuction', createBid = createBid' - edit in lib/Quixotic/Database/PostgreSQL.hs at line 281
- edit in lib/Quixotic/Database/PostgreSQL.hs at line 285
- edit in lib/Quixotic/Database/PostgreSQL.hs at line 287
, findProject = findProject' - replacement in lib/Quixotic/Database.hs at line 25
{ recordEvent :: ProjectId -> UserId -> LogEntry -> m EventId{ createEvent :: ProjectId -> UserId -> LogEntry -> m EventId - replacement in lib/Quixotic/Database.hs at line 28
, newAuction :: ProjectId -> Auction -> m AuctionId, readAuction :: AuctionId -> m (Maybe Auction), recordBid :: AuctionId -> Bid -> m (), createAuction :: ProjectId -> Auction -> m AuctionId, findAuction :: AuctionId -> m (Maybe Auction), createBid :: AuctionId -> Bid -> m () - edit in lib/Quixotic/Database.hs at line 33
- edit in lib/Quixotic/Database.hs at line 37
- edit in lib/Quixotic/Database.hs at line 39
, findProject :: ProjectId -> m (Maybe Project) - edit in lib/Quixotic/Json.hs at line 11
import Data.Data - edit in lib/Quixotic/Json.hs at line 13
import Data.Dataimport Data.List.NonEmpty as Limport Data.Map.Strict as MS - edit in lib/Quixotic/Json.hs at line 18
import Quixotic.Databaseimport Quixotic.Intervalimport Quixotic.TimeLog - edit in lib/Quixotic/Json.hs at line 61
qdbProjectJSON :: QDBProject -> ValueqdbProjectJSON qp =object [ "projectId" .= (qp ^. (projectId._ProjectId)), "project" .= projectJSON (qp ^. project)] - edit in lib/Quixotic/Json.hs at line 73[3.2561]
payoutsJSON :: Payouts -> ValuepayoutsJSON (Payouts m) = toJSON $ MS.mapKeys (^. _BtcAddr) mparsePayoutsJSON :: Value -> Parser PayoutsparsePayoutsJSON v =Payouts . MS.mapKeys BtcAddr <$> parseJSON vworkIndexJSON :: WorkIndex -> ValueworkIndexJSON (WorkIndex widx) =toJSON $ (L.toList . fmap intervalJSON) <$> (MS.mapKeysMonotonic (^._BtcAddr) widx)eventIdJSON :: EventId -> ValueeventIdJSON (EventId eid) = toJSON eid - replacement in lib/Quixotic/TimeLog.hs at line 9
, WorkIndex(WorkIndex), _WorkIndex, workIndex, workIndexJSON, WorkIndex(WorkIndex), _WorkIndex, workIndex - replacement in lib/Quixotic/TimeLog.hs at line 11
, EventId(EventId), _EventId, eventIdJSON, EventId(EventId), _EventId - edit in lib/Quixotic/TimeLog.hs at line 25
import Data.Aeson.Types - edit in lib/Quixotic/TimeLog.hs at line 35
import Quixotic.Json - edit in lib/Quixotic/TimeLog.hs at line 82
payoutsJSON :: Payouts -> ValuepayoutsJSON (Payouts m) = toJSON $ MS.mapKeys (^. _BtcAddr) mparsePayoutsJSON :: Value -> Parser PayoutsparsePayoutsJSON v =Payouts . MS.mapKeys BtcAddr <$> parseJSON vinstance A.ToJSON Payouts wheretoJSON = versioned (Version 1 0 0) . payoutsJSONinstance A.FromJSON Payouts whereparseJSON v = let parsePayouts (Version 1 0 0) = parsePayoutsJSONparsePayouts v' = \_ -> fail . show $ printVersion v'in unversion parsePayouts $ v - edit in lib/Quixotic/TimeLog.hs at line 84
workIndexJSON :: WorkIndex -> ValueworkIndexJSON (WorkIndex widx) =toJSON $ (L.toList . fmap intervalJSON) <$> (MS.mapKeysMonotonic (^._BtcAddr) widx) - edit in lib/Quixotic/TimeLog.hs at line 85
eventIdJSON :: EventId -> ValueeventIdJSON (EventId eid) = toJSON eid - replacement in server/Main.hs at line 48
qms <- nestSnaplet "qmodules" qm qdbpgSnapletInitqms <- nestSnaplet "qmodules" qm qdbpgSnapletInit - replacement in server/Main.hs at line 53[3.8755]→[3.6991:7055](∅→∅),[3.7055]→[3.851:914](∅→∅),[3.179]→[3.851:914](∅→∅),[3.914]→[3.7056:7504](∅→∅),[3.7504]→[3.847:926](∅→∅),[3.847]→[3.847:926](∅→∅),[3.926]→[3.7505:7585](∅→∅)
addRoutes [ ("login", requireLogin >> (redirect "/home")), ("register", void $ method POST registerHandler), ("projects/:projectId/logStart/:btcAddr", serveJSON eventIdJSON . method POST $ logWorkHandler StartWork), ("projects/:projectId/logEnd/:btcAddr", serveJSON eventIdJSON . method POST $ logWorkHandler StopWork), ("projects/:projectId/log/:btcAddr", serveJSON workIndexJSON $ method GET loggedIntervalsHandler), ("projects/:projectId", serveJSON projectJSON $ method GET projectGetHandler), ("projects", void $ method POST projectCreateHandler), ("payouts/:projectId", serveJSON id $ method GET payoutsHandler)let loginRoute = requireLogin >> redirect "/home"registerRoute = void $ method POST registerHandlerlogEventRoute f = serveJSON eventIdJSON . method POST $ logWorkHandler floggedIntervalsRoute = serveJSON workIndexJSON $ method GET loggedIntervalsHandlerprojectCreateRoute = void $ method POST projectCreateHandlerprojectRoute = serveJSON projectJSON $ method GET projectGetHandlerlistProjectsRoute = serveJSON (fmap qdbProjectJSON) $ method GET projectListHandlerpayoutsRoute = serveJSON payoutsJSON $ method GET payoutsHandleraddRoutes [ ("login", loginRoute), ("register", registerRoute), ("projects/:projectId/logStart/:btcAddr", logEventRoute StartWork), ("projects/:projectId/logEnd/:btcAddr", logEventRoute StopWork), ("projects/:projectId/log/:btcAddr", loggedIntervalsRoute), ("projects/:projectId", projectRoute), ("projects", listProjectsRoute), ("projects", projectCreateRoute), ("payouts/:projectId", payoutsRoute) - edit in server/Quixotic/Snaplet/Projects.hs at line 24
projectGetHandler :: Handler App App ProjectprojectGetHandler = ok - edit in server/Quixotic/Snaplet/Projects.hs at line 40[3.1564]
projectGetHandler :: Handler App App ProjectprojectGetHandler = doQDB{..} <- view qdb <$> with qm getuid <- requireUserIdpid <- requireProjectAccess uidmp <- liftPG . runReaderT $ findProject pidmaybe (snapError 404 $ "Project not found for id " <> tshow pid) pure mp - replacement in server/Quixotic/Snaplet/WorkLog.hs at line 30
storeEv addr = runReaderT . recordEvent pid uid $ logEntry addrstoreEv addr = runReaderT . createEvent pid uid $ logEntry addr