diff options
author | William Carroll <wpcarro@gmail.com> | 2020-07-30T17·38+0100 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2020-07-30T17·38+0100 |
commit | dec8890190ff0b86f1a50044814701ef39b808e6 (patch) | |
tree | 3a6c5e821c43e3cbe920abfedcf87134716f7a6c /src/PendingAccounts.hs | |
parent | 30838b8df7350d9dd37b5873f21247d6bddefc15 (diff) |
Verify users' email addresses when they attempt to sign-up
Lots of changes here: - Add the GET /verify endpoint - Email users a secret using MailGun - Create a PendingAccounts table and record type - Prefer do-notation for FromRow instances (and in general) instead of the <*> or a liftA2 style. Using instances using `<*>` makes the instances depend on the order in which the record's fields were defined. When combined with a "SELECT *", which returns the columns in whichever order the schema defines them (or depending on the DB implementation), produces runtime parse errors at best and silent errors at worst. - Delete bill from accounts.csv to free up the wpcarro@gmail.com when testing the /verify route.
Diffstat (limited to 'src/PendingAccounts.hs')
-rw-r--r-- | src/PendingAccounts.hs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/PendingAccounts.hs b/src/PendingAccounts.hs new file mode 100644 index 000000000000..9f86d1dd0554 --- /dev/null +++ b/src/PendingAccounts.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +-------------------------------------------------------------------------------- +module PendingAccounts where +-------------------------------------------------------------------------------- +import Database.SQLite.Simple + +import qualified Types as T +-------------------------------------------------------------------------------- + +create :: FilePath + -> T.RegistrationSecret + -> T.Username + -> T.ClearTextPassword + -> T.Role + -> T.Email + -> IO () +create dbFile secret username password role email = withConnection dbFile $ \conn -> do + hashed <- T.hashPassword password + execute conn "INSERT INTO PendingAccounts (secret,username,password,role,email) VALUES (?,?,?,?,?)" + (secret, username, hashed, role, email) + +get :: FilePath -> T.Username -> IO (Maybe T.PendingAccount) +get dbFile username = withConnection dbFile $ \conn -> do + res <- query conn "SELECT * FROM PendingAccounts WHERE username = ?" (Only username) + case res of + [x] -> pure (Just x) + _ -> pure Nothing + +delete :: FilePath -> T.Username -> IO () +delete dbFile username = withConnection dbFile $ \conn -> + execute conn "DELETE FROM PendingAccounts WHERE username = ?" (Only username) |