From 86bd06f8edc9bef9668a2a241b8bf1eecfaf611e Mon Sep 17 00:00:00 2001
From: TropiiDev <colinbassett28@proton.me>
Date: Fri, 18 Apr 2025 20:24:23 -0400
Subject: [PATCH] Implement a way to update tasks. v0.0.2

---
 api.py    | 53 +++++++++++++++++++++++++++--------------------------
 auth.py   |  4 ++--
 tables.py | 10 ++++++++--
 3 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/api.py b/api.py
index 613c466..7685855 100644
--- a/api.py
+++ b/api.py
@@ -45,40 +45,41 @@ def create_user(user: UserCreate, session: SessionDep):
     session.refresh(db_user)
     return db_user
 
+@app.patch("/user/update-tasks", response_model=UserPublic)
+async def update_user_task(task: UpdateTask, session: SessionDep, current_user: User = Depends(get_current_user)):
+    user_db = session.get(User, current_user.id)
+    user_data = task.model_dump(exclude_unset=True)
+
+    new_task = user_data
+    
+    # Filter out the task with matching title and keep all others
+    updated_tasks = [
+        task for task in user_db.tasks 
+        if task['title'] != new_task['title']
+    ]
+    
+    # Add the new task to the filtered list
+    updated_tasks.append(new_task)
+    
+    # Update user_db tasks with the new list
+    user_db.tasks = updated_tasks
+
+    # Update the session
+    session.add(user_db)
+    session.commit()
+    session.refresh(user_db)
+        
+    return user_db
+
 @app.patch("/user/update", response_model=UserPublic)
 async def update_user(user: UserUpdate, session: SessionDep, current_user: User = Depends(get_current_user)):
     user_db = session.get(User, current_user.id)
     user_data = user.model_dump(exclude_unset=True)
-    print(f"l52_db: {user_db.tasks}")
-    if 'tasks' in user_data:
-        if user_db.tasks is None:
-            user_db.tasks = []
-          
-        for i in range(len(user_db.tasks)): # loop through all tasks
-          if user_db.tasks[i]['title'] == user_data['tasks'][i]['title']: # check if there is a task with the same title
-            # if there is, check if the is_completed status has changed
-            # if it has, update the task in the db
-            # if it hasn't, do nothing
-            if user_db.tasks[i]['is_completed'] != user_data['tasks'][i]['is_completed']:
-              # update the task in the db
-              updated_task = user_db.tasks[i]
-              updated_task['is_completed'] = user_data['tasks'][i]['is_completed']
-              break
-          else:
-              current_tasks = user_db.tasks
-              new_task = user_data['tasks']
-              user_data.tasks = current_tasks + new_task
-    print(f"l71_update_db: {user_db.tasks}")
-    print(f"l72_update_user_data: {user_data}")
+
     user_db.sqlmodel_update(user_data)
-    print(f"l74_user_data {user_data}")
-    print(f"l75_user_db: {user_db.tasks}")
     session.add(user_db)
-    print("l##_db: ", user_db.tasks)
     session.commit()
-    print("l76_not_refresh_db: ", user_db.tasks) # randomly sets is_completed to false even though its true every other time
     session.refresh(user_db)
-    print(f"l77_db: {user_db.tasks}")
     return user_db
 
 @app.get('/user/login')
diff --git a/auth.py b/auth.py
index 1d843d0..cbea008 100644
--- a/auth.py
+++ b/auth.py
@@ -23,9 +23,9 @@ def create_access_token(data: dict, expires_delta: timedelta | None = None):
     to_encode = data.copy()
 
     if expires_delta:
-        expire = datetime.now(datetime.timezone.utc) + expires_delta
+        expire = datetime.utcnow() + expires_delta
     else:
-        expire = datetime.now(datetime.timezone.utc) + timedelta(minutes=15)
+        expire = datetime.utcnow() + timedelta(minutes=15)
 
     to_encode.update({"exp": expire})
     encoded_jwt = jwt.encode(to_encode, secret_key, algorithm=algo)
diff --git a/tables.py b/tables.py
index c407670..9aece15 100644
--- a/tables.py
+++ b/tables.py
@@ -14,7 +14,12 @@ class TokenData(BaseModel):
 class Task(BaseModel):
   title: str
   description: str | None = None
-  is_completed: bool = False
+  is_completed: bool | None = Field(default=False)
+
+class UpdateTask(BaseModel):
+  title: str | None = None
+  description: str | None = None
+  is_completed: bool | None = Field(default=None)
 
 # User models
 class UserBase(SQLModel):
@@ -44,7 +49,8 @@ class UserUpdate(SQLModel):
   name: str | None = None
   email: str | None = None
   password: str | None = None
-  tasks: list[Task] | None = None
+  username: str | None = None 
+  is_active: bool | None = None
 
 class VerifyUser(BaseModel):
   email: str