Use live signup API for client.
[?]
Oct 5, 2020, 7:50 PM
ENNZIQJG4XJ62QCNRMLNAXN7ICTPCHQFZTURX6QSUYYWNADFJHXQCDependencies
- [2]
5IDB3IWSIntegrate zcashd-based zaddr validation. - [3]
SAESJLLYInitial experiments in hash routing. - [4]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [5]
AL37SVTCImplement payments service endpoints. - [6]
DFOBMSAOInitial work on payments API - [7]
JFOEOFGAstylish-haskell formatting. - [8]
Q5X5RYQLstylish-haskell reformatting - [9]
EFSXYZPOAutoformat everything with brittany. - [10]
BROSTG5KBeginning of modularization of server. - [11]
BFZN4SUAMake timeline component work. - [12]
TKGBRIQTLogin component now raises LoginComplete message. - [13]
UWMGUJOWAutoformat sources. - [14]
4R7XIYK3Switch from ClassyPrelude to Relude - [15]
O2BZOX7MAdd signup form, captcha check. - [16]
U256ZALIAdd captcha check to register route. - [17]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [18]
WRPIYG3EUse project listing functionality to check for whether we have a cookie. - [19]
HMDM3B55Implement core of payments/billing infrastructure. - [20]
B6HWAPDPModularize & update to recent haskoin. - [21]
MB5SHULBAdd route for accepting an invitation with an existing account - [22]
73NDXDEZBegin implementation of billing event persistence. - [23]
IPG33FAWAdd billing daemon - [24]
I2KHGVD4Require project permissions for access to most data. - [25]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [26]
LTSVBVA2Update to a recent haskoin-core. Fix Stack build. - [27]
W35DDBFYFactor common JSON conversions up into client lib module. - [28]
IZEVQF62Work in progress replacing sqlite with postgres. - [29]
SEWTRB6SImplement payment request creation functions. - [30]
NJNMO72SAdd zcash.com submodule and update client to modern halogen. - [31]
QU5FW67RAdd project selection to time tracker. - [32]
5R2Z7FSXInitial rendering for signup controls. - [33]
NEDDHXUKReformat via stylish-haskell - [*]
RB2ETNIFAdd skeletal PureScript client project. - [*]
Y3LIJ5USAdd handler for CreatePaymentRequest - [*]
EMVTF2IWWIP moving back to snap. - [*]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [*]
ADMKQQGCInitial empty Snap project.
Change contents
- replacement in aftok.cabal at line 1
cabal-version: 2.4cabal-version: 3.0 - edit in aftok.cabal at line 19
, MultiParamTypeClasses - edit in aftok.cabal at line 21
, RankNTypes - replacement in client/src/Aftok/Api/Account.purs at line 5
import Control.Monad.Trans.Class (lift)import Data.Argonaut.Core (stringify) - edit in client/src/Aftok/Api/Account.purs at line 16
import Halogen as Himport Halogen.HTML.Core (ClassName(..))import Halogen.HTML as HHimport Halogen.HTML.CSS as CSSimport Halogen.HTML.Events as Eimport Web.Event.Event as WEimport Halogen.HTML.Properties as Pimport CSS (backgroundImage, url)import Landkit.Card as Cardimport Aftok.Types (System) - edit in client/src/Aftok/Api/Account.purs at line 73
| ServiceError (Maybe StatusCode) String - edit in client/src/Aftok/Api/Account.purs at line 75
instance srShow :: Show SignupResponse whereshow r = case r ofSignupOK -> "SignupOK"CaptchaInvalid -> "CaptchaInvalid"ZAddrInvalid -> "ZAddrInvalid"UsernameTaken -> "UsernameTaken"ServiceError _ _ -> "ServiceError" - replacement in client/src/Aftok/Api/Account.purs at line 88
= ZAddrCheckOK= ZAddrCheckValid - replacement in client/src/Aftok/Api/Account.purs at line 97
pure ZAddrCheckOKresult <- get RF.ignore ("/api/validate_zaddr?zaddr=" <> zaddr)case result ofLeft err -> dolog ("ZAddr validation failed: " <> printError err)pure ZAddrCheckInvalidRight r | r.status == StatusCode 200 -> dopure ZAddrCheckValidRight r -> dolog ("ZAddr was determined to be invalid: " <> r.statusText)pure ZAddrCheckInvalid - replacement in client/src/Aftok/Api/Account.purs at line 114
RecoverByEmail _ => "email"RecoverByZAddr _ => "zaddr", email: case req.recoverBy ofRecoverByEmail email -> Just emailRecoverByZAddr _ -> Nothing, zaddr: case req.recoverBy ofRecoverByEmail _ -> NothingRecoverByZAddr zaddr -> Just zaddrRecoverByEmail _ -> "email"RecoverByZAddr _ -> "zaddr", recoveryEmail: case req.recoverBy ofRecoverByEmail email -> Just emailRecoverByZAddr _ -> Nothing, recoveryZAddr: case req.recoverBy ofRecoverByEmail _ -> NothingRecoverByZAddr zaddr -> Just zaddr - replacement in client/src/Aftok/Api/Account.purs at line 124
result <- post RF.ignore "/api/register" (Just <<< RB.Json $ signupJson)log ("Sending JSON request: " <> stringify signupJSON)result <- post RF.ignore "/api/register" (Just <<< RB.Json $ signupJSON) - replacement in client/src/Aftok/Api/Account.purs at line 127
Left err -> log ("Registration failed: " <> printError err)Right r -> log ("Registration status: " <> show r.status)Left err -> dolog ("Registration failed: " <> printError err)pure (ServiceError Nothing $ printError err)Right r | r.status == StatusCode 200 -> dolog "Registration succeeded!"pure SignupOKRight r | r.status == StatusCode 403 -> dolog ("Registration failed: Capcha Invalid")pure CaptchaInvalidRight r | r.status == StatusCode 400 -> dolog ("Registration failed: Z-Address Invalid")pure ZAddrInvalidRight r -> dolog ("Registration failed: " <> r.statusText)pure $ ServiceError (Just r.status) r.statusText - edit in client/src/Aftok/Signup.purs at line 222
lift $ system.log "Switching to signin..." - replacement in client/src/Aftok/Signup.purs at line 226
Acc.ZAddrCheckOK -> pure unitAcc.ZAddrCheckValid -> pure unit - edit in client/src/Aftok/Signup.purs at line 230
lift $ system.log "Switching to signin..." - edit in client/src/Aftok/Signup.purs at line 247
lift $ system.log "Sending signup request..." - replacement in client/src/Aftok/Signup.purs at line 255
Left errors ->Left errors -> dolift $ system.log "Got signup HTTP error." - edit in client/src/Aftok/Signup.purs at line 260
lift <<< system.log $ "Got signup response " <> show response - replacement in client/src/Aftok/Signup.purs at line 262
Acc.SignupOK -> H.raise (SignupComplete $ req.username)Acc.CaptchaInvalid -> H.modify_ (_ { signupErrors = [CaptchaError] })Acc.ZAddrInvalid -> H.modify_ (_ { signupErrors = [ZAddrInvalid] })Acc.UsernameTaken -> H.modify_ (_ { signupErrors = [UsernameTaken] })Acc.SignupOK -> H.raise (SignupComplete $ req.username)Acc.CaptchaInvalid -> H.modify_ (_ { signupErrors = [CaptchaError] })Acc.ZAddrInvalid -> H.modify_ (_ { signupErrors = [ZAddrInvalid] })Acc.UsernameTaken -> H.modify_ (_ { signupErrors = [UsernameTaken] })Acc.ServiceError c m -> H.modify_ (_ { signupErrors = [APIError { status: c, message: m }]}) - edit in client/src/Aftok/Signup.purs at line 337
apiCapability :: Capability AffapiCapability ={ checkUsername: \_ -> pure Acc.UsernameCheckOK, checkZAddr: Acc.checkZAddr, signup: Acc.signup, getRecaptchaResponse: liftEffect <<< getRecaptchaResponse} - replacement in client/src/Aftok/Signup.purs at line 349
, checkZAddr: \_ -> pure Acc.ZAddrCheckOK, checkZAddr: \_ -> pure Acc.ZAddrCheckValid - replacement in client/src/Main.purs at line 34
signup = Signup.mockCapabilitysignup = Signup.apiCapability - edit in daemon/AftokD/AftokM.hs at line 35
import Haskoin.Address ( Address ) - edit in daemon/AftokD/AftokM.hs at line 48
, userEmail - edit in daemon/AftokD/AftokM.hs at line 49
)import Aftok.Currency.Bitcoin ( NetworkId, satoshi - edit in daemon/AftokD/AftokM.hs at line 50
import Aftok.Currency.Bitcoin ( satoshi ) - edit in daemon/AftokD/AftokM.hs at line 55
, ContactChannel(..), contactChannel - replacement in daemon/AftokD/AftokM.hs at line 160
-> P.PaymentRequest'( Subscription'(User (NetworkId, Address))(Billable' Project UserId Satoshi))-> P.PaymentRequest' (Subscription' User (Billable' Project UserId Satoshi)) - replacement in daemon/AftokD/AftokM.hs at line 173
Just template ->Just template -> dotoEmail <- case req ^. (subscription . contactChannel) ofEmailChannel email -> pure email-- TODO: other channels - edit in daemon/AftokD/AftokM.hs at line 178
toEmail = req ^. (subscription . customer . userEmail) - replacement in daemon/AftokD/AftokM.hs at line 191
in pure $ SMTP.simpleMail fromAddr [toAddr] [] [] subject [body]pure $ SMTP.simpleMail fromAddr [toAddr] [] [] subject [body] - replacement in lib/Aftok/Billables.hs at line 16
import Aftok.Types (UserId, ProjectId)import Bippy.Types (Satoshi)import Aftok.Types (UserId, ProjectId, Email)import Bippy.Types (Satoshi) - edit in lib/Aftok/Billables.hs at line 77
data ContactChannel= EmailChannel Email - replacement in lib/Aftok/Billables.hs at line 82[3.149]→[3.149:189](∅→∅),[3.189]→[3.1480:1508](∅→∅),[3.659]→[3.1480:1508](∅→∅),[3.1480]→[3.1480:1508](∅→∅),[3.1508]→[3.660:694](∅→∅)
{ _customer :: u, _billable :: b, _startTime :: C.UTCTime, _endTime :: Maybe C.UTCTime{ _customer :: u, _billable :: b, _contactChannel :: ContactChannel, _startTime :: C.UTCTime, _endTime :: Maybe C.UTCTime - edit in lib/Aftok/Database/PostgreSQL.hs at line 246
<*> (B.EmailChannel . Email <$> field) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 678
[sql| SELECT id, billable_id, start_date, end_date[sql| SELECT id, billable_id, contact_email, start_date, end_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 685
[sql| SELECT s.id, user_id, billable_id, start_date, end_date[sql| SELECT s.id, user_id, billable_id, contact_email, start_date, end_date - replacement in lib/Aftok/Database/PostgreSQL.hs at line 742
s.user_id, s.billable_id, s.start_date, s.end_date,s.user_id, s.billable_id, s.contact_email, s.start_date, s.end_date, - edit in lib/Aftok/Database.hs at line 8
-- brittany --disable-next-binding - replacement in lib/Aftok/Users.hs at line 14
{ parseZAddr :: Text -> m (Either RegisterError ZAddr){ parseZAddr :: Text -> m (Either ZAddrError ZAddr) - replacement in server/Aftok/Snaplet/Users.hs at line 6[3.2560]→[3.3137:3157](∅→∅),[3.8604]→[3.3137:3157](∅→∅),[3.3137]→[3.3137:3157](∅→∅),[3.3157]→[3.449:477](∅→∅)
( registerHandler, acceptInvitationHandler( acceptInvitationHandler, checkZAddrHandler, registerHandler - edit in server/Aftok/Snaplet/Users.hs at line 41
import Aftok.Currency.Zcash ( ZAddr ) - replacement in server/Aftok/Snaplet/Users.hs at line 76
"email" -> RecoverByEmail . Email <$> v .: "email""zaddr" -> RecoverByZAddr <$> v .: "zaddr""email" -> RecoverByEmail . Email <$> v .: "recoveryEmail""zaddr" -> RecoverByZAddr <$> v .: "recoveryZAddr" - edit in server/Aftok/Snaplet/Users.hs at line 94
checkZAddrHandler :: RegisterOps IO -> S.Handler App App ZAddrcheckZAddrHandler ops = doparams <- S.getParamszaddrBytes <- maybe (snapError 400 "zaddr parameter is required")pure(listToMaybe =<< M.lookup "zaddr" params)zaddrEither <- liftIO $ parseZAddr ops (T.decodeUtf8 zaddrBytes)case zaddrEither ofLeft _ ->snapError 400 "The Z-Address provided for account recovery was invalid."Right zaddr ->pure zaddr - edit in server/Aftok/Snaplet/Users.hs at line 113
- replacement in server/Aftok/Snaplet/Users.hs at line 125
Left _ -> snapError 400 "The Z-Address provided for account recovery was invalid."Right r -> pure $ RecoverByZAddr rLeft _ ->snapError 400 "The Z-Address provided for account recovery was invalid."Right r ->pure $ RecoverByZAddr r - edit in server/Aftok/Snaplet/Users.hs at line 142
- edit in server/Main.hs at line 22
import Aftok.Users ( RegisterError(..) ) - replacement in server/Main.hs at line 51
{ parseZAddr =(pure . first ZAddrParseError)<=< rpcValidateZAddr mgr (_zcashdConfig cfg){ parseZAddr = rpcValidateZAddr mgr (_zcashdConfig cfg) - edit in server/Main.hs at line 77
checkZAddrRoute = void $ method GET (checkZAddrHandler rops) - edit in server/Main.hs at line 133
, ("validate_zaddr", checkZAddrRoute)