Implement a way to update tasks. v0.0.2

This commit is contained in:
TropiiDev 2025-04-18 20:24:23 -04:00
parent 2b4d9d1a1f
commit 86bd06f8ed
3 changed files with 37 additions and 30 deletions

53
api.py
View File

@ -45,40 +45,41 @@ def create_user(user: UserCreate, session: SessionDep):
session.refresh(db_user) session.refresh(db_user)
return 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) @app.patch("/user/update", response_model=UserPublic)
async def update_user(user: UserUpdate, session: SessionDep, current_user: User = Depends(get_current_user)): async def update_user(user: UserUpdate, session: SessionDep, current_user: User = Depends(get_current_user)):
user_db = session.get(User, current_user.id) user_db = session.get(User, current_user.id)
user_data = user.model_dump(exclude_unset=True) 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) 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) session.add(user_db)
print("l##_db: ", user_db.tasks)
session.commit() 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) session.refresh(user_db)
print(f"l77_db: {user_db.tasks}")
return user_db return user_db
@app.get('/user/login') @app.get('/user/login')

View File

@ -23,9 +23,9 @@ def create_access_token(data: dict, expires_delta: timedelta | None = None):
to_encode = data.copy() to_encode = data.copy()
if expires_delta: if expires_delta:
expire = datetime.now(datetime.timezone.utc) + expires_delta expire = datetime.utcnow() + expires_delta
else: else:
expire = datetime.now(datetime.timezone.utc) + timedelta(minutes=15) expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire}) to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, secret_key, algorithm=algo) encoded_jwt = jwt.encode(to_encode, secret_key, algorithm=algo)

View File

@ -14,7 +14,12 @@ class TokenData(BaseModel):
class Task(BaseModel): class Task(BaseModel):
title: str title: str
description: str | None = None 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 # User models
class UserBase(SQLModel): class UserBase(SQLModel):
@ -44,7 +49,8 @@ class UserUpdate(SQLModel):
name: str | None = None name: str | None = None
email: str | None = None email: str | None = None
password: str | None = None password: str | None = None
tasks: list[Task] | None = None username: str | None = None
is_active: bool | None = None
class VerifyUser(BaseModel): class VerifyUser(BaseModel):
email: str email: str