From 242ec6badf38ca9dbdac3bb5623f375d29e99775 Mon Sep 17 00:00:00 2001
From: James2Tulloch <146088090+James2Tulloch@users.noreply.github.com>
Date: Sun, 2 Mar 2025 11:51:30 +0000
Subject: [PATCH] First pass of firstlogin bool

---
 django_project/myapp/views/userviews.py |  4 +++-
 rust_crud_api/src/db/groups.rs          |  3 ++-
 rust_crud_api/src/db/init.rs            |  1 +
 rust_crud_api/src/db/mod.rs             |  2 +-
 rust_crud_api/src/db/users.rs           | 25 ++++++++++++++++++++-----
 rust_crud_api/src/models/user.rs        |  2 ++
 6 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/django_project/myapp/views/userviews.py b/django_project/myapp/views/userviews.py
index d4e21c4..0c5bedf 100644
--- a/django_project/myapp/views/userviews.py
+++ b/django_project/myapp/views/userviews.py
@@ -24,6 +24,7 @@ def register_view(request):
         studentid_str = request.POST.get('studentid', '').strip()
         startyear_str = request.POST.get('startyear', '').strip()
         endyear_str = request.POST.get('endyear', '').strip()
+        
 
         # 1. Check required fields
         if not all([name, email, password, username, studentid_str, startyear_str, endyear_str]):
@@ -89,7 +90,8 @@ def register_view(request):
                 studentid,
                 startyear,
                 endyear,
-                saved_path
+                saved_path, 
+                True
             )
             # 5. After successful registration, redirect to login or some other page
             return redirect('login')
diff --git a/rust_crud_api/src/db/groups.rs b/rust_crud_api/src/db/groups.rs
index 6b0c264..5ef592d 100644
--- a/rust_crud_api/src/db/groups.rs
+++ b/rust_crud_api/src/db/groups.rs
@@ -85,7 +85,8 @@ pub fn get_group_members(db_url: &str, group_id: i32) -> PyResult<Vec<User>> {
         studentid: row.get(4),
         startyear: row.get(5),
         endyear: row.get(6),
-        profilepicture: row.get(7)
+        profilepicture: row.get(7),
+        firstlogin: row.get(8)
     }).collect();
     
     Ok(users)
diff --git a/rust_crud_api/src/db/init.rs b/rust_crud_api/src/db/init.rs
index aa85fa7..1c45983 100644
--- a/rust_crud_api/src/db/init.rs
+++ b/rust_crud_api/src/db/init.rs
@@ -21,6 +21,7 @@ pub fn init_db(db_url: &str) -> PyResult<()> {
             startyear INT NOT NULL,
             endyear INT NOT NULL,
             profilepicture VARCHAR
+            firstlogin BOOLEAN NOT NULL DEFAULT TRUE,
         );
         CREATE TABLE IF NOT EXISTS groups (
             id SERIAL PRIMARY KEY,
diff --git a/rust_crud_api/src/db/mod.rs b/rust_crud_api/src/db/mod.rs
index d718c04..b59c637 100644
--- a/rust_crud_api/src/db/mod.rs
+++ b/rust_crud_api/src/db/mod.rs
@@ -4,6 +4,6 @@ pub mod init;
 pub mod posts;
 
 pub use init::init_db;
-pub use users::{create_user, get_user, get_all_users, update_user, delete_user};
+pub use users::{create_user, get_user, get_all_users, update_user, delete_user, update_first_login};
 pub use groups::{create_group, get_group, get_all_groups, add_user_to_group, get_group_members, delete_group};
 pub use posts::{create_post, get_user_posts, get_group_posts, get_feed};
diff --git a/rust_crud_api/src/db/users.rs b/rust_crud_api/src/db/users.rs
index 79cf346..ec15724 100644
--- a/rust_crud_api/src/db/users.rs
+++ b/rust_crud_api/src/db/users.rs
@@ -11,13 +11,13 @@ fn pg_err(e: postgres::Error) -> PyErr {
 
 #[pyfunction]
 pub fn create_user(
-    db_url: &str, name: &str, email: &str, password: &str, username: &str, studentid: i32, startyear: i32, endyear: i32, profilepicture: Option<&str>,) -> PyResult<()> {
+    db_url: &str, name: &str, email: &str, password: &str, username: &str, studentid: i32, startyear: i32, endyear: i32, profilepicture: Option<&str>, firstlogin: bool) -> PyResult<()> {
     let password_hash = hash_password(password)?;
     let mut client = Client::connect(db_url, NoTls).map_err(pg_err)?;
     let result = client.execute(
-        "INSERT INTO users (name, email, password_hash, username, studentid, startyear, endyear, profilepicture)
-         VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
-        &[&name, &email, &password_hash, &username, &studentid, &startyear, &endyear, &profilepicture],
+        "INSERT INTO users (name, email, password_hash, username, studentid, startyear, endyear, profilepicture, firstlogin)
+         VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
+        &[&name, &email, &password_hash, &username, &studentid, &startyear, &endyear, &profilepicture, &firstlogin],
     );
 
     match result {
@@ -42,7 +42,7 @@ pub fn create_user(
 pub fn get_user(db_url: &str, user_id: i32) -> PyResult<Option<User>> {
     let mut client = Client::connect(db_url, NoTls).map_err(pg_err)?;
     let row_opt = client.query_opt(
-        "SELECT id, name, email, username, studentid, startyear, endyear, profilepicture FROM users WHERE id = $1",
+        "SELECT id, name, email, username, studentid, startyear, endyear, profilepicture, firstlogin FROM users WHERE id = $1",
         &[&user_id]
     ).map_err(pg_err)?;
     
@@ -56,6 +56,7 @@ pub fn get_user(db_url: &str, user_id: i32) -> PyResult<Option<User>> {
             startyear: row.get(5),
             endyear: row.get(6),
             profilepicture: row.get(7),
+            firstlogin: row.get(8),
             
         };
         Ok(Some(user))
@@ -82,6 +83,7 @@ pub fn get_all_users(db_url: &str) -> PyResult<Vec<User>> {
             startyear: row.get(5),
             endyear: row.get(6),
             profilepicture: row.get(7),
+            firstlogin: row.get(8),
 
         });
     }
@@ -145,3 +147,16 @@ pub fn update_user_profile_picture(db_url: &str, user_id: i32, path: &str) -> Py
     }
 }
 
+#[pyfunction]
+pub fn update_first_login(db_url: &str, user_id: i32, first_login: bool) -> PyResult<()> {
+    let mut client = Client::connect(db_url, NoTls).map_err(pg_err)?;
+    let updated = client.execute(
+        "UPDATE users SET first_login = $1 WHERE id = $2",
+        &[&first_login, &user_id],
+    ).map_err(pg_err)?;
+    if updated == 0 {
+        Err(PyRuntimeError::new_err("User not found"))
+    } else {
+        Ok(())
+    }
+}
diff --git a/rust_crud_api/src/models/user.rs b/rust_crud_api/src/models/user.rs
index b1530f9..65fbdb9 100644
--- a/rust_crud_api/src/models/user.rs
+++ b/rust_crud_api/src/models/user.rs
@@ -20,5 +20,7 @@ pub struct User {
     pub endyear: i32,
     #[pyo3(get,set)]
     pub profilepicture: Option<String>, 
+    #[pyo3(get,set)]
+    pub firstlogin: bool,
 }
 
-- 
GitLab