about summary refs log tree commit diff
path: root/src/Accounts.hs
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-07-28T17·38+0100
committerWilliam Carroll <wpcarro@gmail.com>2020-07-28T17·38+0100
commit012296f156f59fe8581a01f2ddfd2a1067c09108 (patch)
treef95ef3a62db11060e658909836788230c8ede52a /src/Accounts.hs
parentb3556648582c02fb5a9a10a6a4525e212397f945 (diff)
Move SQL out of API and into separate modules
Create modules for each Table in our SQL database. This cleans up the handler
bodies at the expense of introducing more files and indirection.
Diffstat (limited to 'src/Accounts.hs')
-rw-r--r--src/Accounts.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Accounts.hs b/src/Accounts.hs
new file mode 100644
index 000000000000..bdc0bf64d432
--- /dev/null
+++ b/src/Accounts.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE OverloadedStrings #-}
+--------------------------------------------------------------------------------
+module Accounts where
+--------------------------------------------------------------------------------
+import Data.Function ((&))
+import Database.SQLite.Simple
+
+import qualified Types as T
+--------------------------------------------------------------------------------
+
+-- | Create a new account in the Accounts table.
+create :: FilePath -> T.Username -> T.ClearTextPassword -> T.Email -> T.Role -> IO ()
+create dbFile username password email role = withConnection dbFile $ \conn -> do
+  hashed <- T.hashPassword password
+  execute conn "INSERT INTO Accounts (username,password,email,role) VALUES (?,?,?,?)"
+    (username, hashed, email, role)
+
+-- | Delete `username` from `dbFile`.
+delete :: FilePath -> T.Username -> IO ()
+delete dbFile username = withConnection dbFile $ \conn -> do
+  execute conn "DELETE FROM Accounts WHERE username = ?"
+    (Only username)
+
+-- | Attempt to find `username` in the Account table of `dbFile`.
+lookup :: FilePath -> T.Username -> IO (Maybe T.Account)
+lookup dbFile username = withConnection dbFile $ \conn -> do
+  res <- query conn "SELECT * FROM Accounts WHERE username = ?" (Only username)
+  case res of
+    [x] -> pure (Just x)
+    _ -> pure Nothing
+
+-- | Return a list of accounts with the sensitive data removed.
+list :: FilePath -> IO [T.User]
+list dbFile = withConnection dbFile $ \conn -> do
+  accounts <- query_ conn "SELECT * FROM Accounts"
+  pure $ T.userFromAccount <$> accounts