Added initial auction create route.
[?]
Mar 6, 2016, 8:14 PM
HALRDT2F22DAQ54M334YSKD2XJCAXDXEZPDKGMOWKH7XELBAS6MACDependencies
- [2]
EKI57EJRAdd alternative implementation of auction winner determination. - [3]
EKY7U7SKFinish conversion to stack. - [4]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [5]
NLZ3JXLOFix formatting with stylish-haskell. - [6]
ZP62WC47Begin conversion to build with stack. - [7]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [8]
Z7KS5XHHVery WIP. Wow. - [9]
M4KM76DGMerge branch 'stackify' - [10]
PBD7LZYQPostgres & auth are beginning to function. - [11]
NEDDHXUKReformat via stylish-haskell - [12]
LHJ2HFXVAdd property test for auction algorithm. - [13]
GKGVYBZGAdded JSON serialization to TimeLog - [14]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [15]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [16]
IZEVQF62Work in progress replacing sqlite with postgres. - [17]
LAROLAYUWIP - [18]
A6HKMINBAttempting to improve JSON handling. - [19]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [20]
NVOCQVASInitial failing tests. - [21]
2G3GNDDUEvent logging is now functioning in postgres. - [22]
KEP5WUFJConvert project to stack-based build. - [23]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [24]
6L5BK5EHUse generic SMTP rather than Sendmail-specific mail client. - [25]
7HPY3QPFFix linting errors. (yay hlint!) - [26]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [27]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [*]
W35DDBFYFactor common JSON conversions up into client lib module. - [*]
I2KHGVD4Require project permissions for access to most data. - [*]
BROSTG5KBeginning of modularization of server. - [*]
ADMKQQGCInitial empty Snap project. - [*]
MGOF7IUFUpdate TASKS list to reflect completed projects.
Change contents
- edit in aftok.cabal at line 29
Aftok.Project - edit in aftok.cabal at line 54
- replacement in lib/Aftok/Auction.hs at line 20
{ _raiseAmount :: Satoshi{ _initiator :: UserId--, _createdAt :: C.UTCTime, _raiseAmount :: Satoshi--, _auctionStart :: C.UTCTime - replacement in lib/Aftok/Database/PostgreSQL.hs at line 21
import Aftok.Auctionimport Aftok.Auction as A - edit in lib/Aftok/Database/PostgreSQL.hs at line 24
import Aftok.Project as P - replacement in lib/Aftok/Database/PostgreSQL.hs at line 94
Auction <$> fieldWith btcParserAuction <$> fieldWith uidParser<*> fieldWith btcParser - replacement in lib/Aftok/Database/PostgreSQL.hs at line 215
"INSERT INTO auctions (project_id, raise_amount, end_time) \\VALUES (?, ?, ?) RETURNING id"(pid ^. _ProjectId, auc ^. (raiseAmount.to fromSatoshi), auc ^. (auctionEnd.to fromThyme))"INSERT INTO auctions (project_id, user_id, raise_amount, end_time) \\VALUES (?, ?, ?, ?) RETURNING id"( pid ^. _ProjectId, auc ^. (A.initiator . _UserId), auc ^. (raiseAmount.to fromSatoshi), auc ^. (auctionEnd.to fromThyme)) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 288
(p ^. projectName, p ^. (inceptionDate.to fromThyme), p ^. (initiator._UserId), toJSON $ p ^. depf)(p ^. projectName, p ^. (inceptionDate.to fromThyme), p ^. (P.initiator . _UserId), toJSON $ p ^. depf) - replacement in lib/Aftok/Database.hs at line 13
import Aftok.Auction (Auction, AuctionId, Bid, BidId)import Aftok.Project as Pimport Aftok.Auction as A - replacement in lib/Aftok/Database.hs at line 90
addUserToProject pid (p ^. initiator) (p ^. initiator)addUserToProject pid (p ^. P.initiator) (p ^. P.initiator) - edit in lib/Aftok/Database.hs at line 155
-- Auction ops - edit in lib/Aftok/Database.hs at line 158[3.1306]
createAuction :: ProjectId -> Auction -> DBProg AuctionIdcreateAuction pid a = dowithProjectAuth pid (a ^. A.initiator) $ CreateAuction pid a - edit in lib/Aftok/Json.hs at line 20
import Aftok.Project - file addition: Project.hs[3.679]
{-# LANGUAGE TemplateHaskell #-}module Aftok.Project whereimport ClassyPreludeimport Control.Lens (makeLenses, makePrisms)import Data.ByteString.Base64.URL as B64import Data.Thyme.Clock as Cimport Data.UUIDimport OpenSSL.Randomimport Aftoknewtype ProjectId = ProjectId UUID deriving (Show, Eq)makePrisms ''ProjectIdtype ProjectName = Textdata Project = Project{ _projectName :: ProjectName, _inceptionDate :: C.UTCTime, _initiator :: UserId, _depf :: DepreciationFunction}makeLenses ''Projectnewtype InvitationCode = InvitationCode ByteString deriving (Eq)makePrisms ''InvitationCoderandomInvCode :: IO InvitationCoderandomInvCode = InvitationCode <$> randBytes 32parseInvCode :: Text -> Either String InvitationCodeparseInvCode t = docode <- B64.decode . encodeUtf8 $ tif length code == 32then Right $ InvitationCode codeelse Left "Invitation code appears to be invalid."renderInvCode :: InvitationCode -> TextrenderInvCode (InvitationCode bs) = decodeUtf8 $ B64.encode bsdata Invitation = Invitation{ _projectId :: ProjectId, _invitingUser :: UserId, _invitedEmail :: Email, _invitationTime :: C.UTCTime, _acceptanceTime :: Maybe C.UTCTime}makeLenses ''Invitation - edit in lib/Aftok.hs at line 12
import Data.ByteString.Base64.URL as B64 - edit in lib/Aftok.hs at line 13
import Data.Thyme.Clock as C - edit in lib/Aftok.hs at line 14
import OpenSSL.Random - edit in lib/Aftok.hs at line 42[3.2984]→[3.1910:1911](∅→∅),[3.1910]→[3.1910:1911](∅→∅),[3.1911]→[3.2271:2326](∅→∅),[3.2326]→[3.3041:3065](∅→∅),[3.3041]→[3.3041:3065](∅→∅),[3.3065]→[3.6911:6935](∅→∅),[3.6935]→[3.3065:3088](∅→∅),[3.3065]→[3.3065:3088](∅→∅),[3.3088]→[3.6245:6279](∅→∅),[3.6279]→[3.6968:7000](∅→∅),[3.6968]→[3.6968:7000](∅→∅),[3.7000]→[3.6280:6352](∅→∅),[3.6352]→[3.3168:3194](∅→∅),[3.10913]→[3.3168:3194](∅→∅),[3.3168]→[3.3168:3194](∅→∅),[3.3194]→[3.7001:7130](∅→∅),[3.7130]→[3.189:237](∅→∅),[3.237]→[3.3399:3400](∅→∅),[3.7179]→[3.3399:3400](∅→∅),[3.3399]→[3.3399:3400](∅→∅),[3.3400]→[3.7180:7291](∅→∅),[3.7291]→[3.238:261](∅→∅),[3.261]→[3.7315:7407](∅→∅),[3.7315]→[3.7315:7407](∅→∅),[3.7025]→[3.3442:3443](∅→∅),[3.7407]→[3.3442:3443](∅→∅),[3.3442]→[3.3442:3443](∅→∅),[3.3443]→[3.7408:7512](∅→∅),[3.7512]→[3.6353:6474](∅→∅),[3.6474]→[3.7625:7697](∅→∅),[3.7625]→[3.7625:7697](∅→∅),[3.7697]→[3.3567:3571](∅→∅),[3.3567]→[3.3567:3571](∅→∅),[3.3571]→[3.7698:7722](∅→∅)
newtype ProjectId = ProjectId UUID deriving (Show, Eq)makePrisms ''ProjectIdtype ProjectName = Textdata Project = Project{ _projectName :: ProjectName, _inceptionDate :: C.UTCTime, _initiator :: UserId, _depf :: DepreciationFunction}makeLenses ''Projectnewtype InvitationCode = InvitationCode ByteString deriving (Eq)makePrisms ''InvitationCoderandomInvCode :: IO InvitationCoderandomInvCode = InvitationCode <$> randBytes 32parseInvCode :: Text -> Either String InvitationCodeparseInvCode t = docode <- B64.decode . encodeUtf8 $ tif length code == 32then Right $ InvitationCode codeelse Left "Invitation code appears to be invalid."renderInvCode :: InvitationCode -> TextrenderInvCode (InvitationCode bs) = decodeUtf8 $ B64.encode bsdata Invitation = Invitation{ _projectId :: ProjectId, _invitingUser :: UserId, _invitedEmail :: Email, _invitationTime :: C.UTCTime, _acceptanceTime :: Maybe C.UTCTime}makeLenses ''Invitation - file addition: Auctions.hs[3.2082]
{-# LANGUAGE TemplateHaskell #-}module Aftok.Snaplet.Auctions( auctionCreateHandler) whereimport ClassyPreludeimport Data.Aesonimport Data.Aeson.Typesimport Data.Thyme.Clock as C--import Data.Thyme.Format.Aeson ()import Aftok.Database (createAuction)import Aftok.Auction (AuctionId, Auction(..))import Aftok.Jsonimport Aftok.Typesimport Aftok.Snapletimport Aftok.Snaplet.Authimport Snap.Snapletdata AuctionCreateRequest = CA { raiseAmount :: Word64, auctionEnd :: C.UTCTime }auctionCreateParser :: Value -> Parser AuctionCreateRequestauctionCreateParser = unv1 "auctions" $ \v ->case v of(Object o) -> CA <$> o .: "raiseAmount"<*> o .: "auctionEnd"_ -> mzeroauctionCreateHandler :: Handler App App AuctionIdauctionCreateHandler = douid <- requireUserIdpid <- requireProjectIdrequestBody <- readRequestJSON 4096req <- either (snapError 400 . tshow) pure $ parseEither auctionCreateParser requestBody--t <- liftIO C.getCurrentTimesnapEval . createAuction pid $ Auction uid (Satoshi . raiseAmount $ req) (auctionEnd req) - edit in server/Aftok/Snaplet/Auth.hs at line 13
import Aftok.Project - replacement in server/Aftok/Snaplet/Projects.hs at line 4
module Aftok.Snaplet.Projects wheremodule Aftok.Snaplet.Projects( projectCreateHandler, projectListHandler, projectGetHandler, projectInviteHandler) where - edit in server/Aftok/Snaplet/Projects.hs at line 24
import Aftok.Project - replacement in server/Aftok/Snaplet/Projects.hs at line 32
data CProject = CP { cpn :: Text, cpdepf :: DepreciationFunction }data ProjectCreateRequest = CP { cpn :: Text, cpdepf :: DepreciationFunction } - replacement in server/Aftok/Snaplet/Projects.hs at line 34
instance FromJSON CProject whereinstance FromJSON ProjectCreateRequest where - edit in server/Aftok/Snaplet/Users.hs at line 17
import Aftok.Project - edit in server/Aftok/Snaplet/WorkLog.hs at line 15
import Aftok.Project - edit in server/Main.hs at line 14
import Aftok.Snaplet.Auctions - edit in server/Main.hs at line 53
auctionCreateRoute = void $ method POST auctionCreateHandler - edit in server/Main.hs at line 72[33.322][3.13275]
, ("projects/:projectId/auctions", auctionCreateRoute)