diff --git a/app/backend/main.py b/app/backend/main.py index ce55719c84245163d88da4438260f8644c036c2e..0bbd87693267aa32eafce6b8493306e2ae23f864 100644 --- a/app/backend/main.py +++ b/app/backend/main.py @@ -12,7 +12,6 @@ from core.config import settings app = FastAPI(title="Shopping App", version="1.0.0", debug=settings.debug) # ------------------- NEW: MOUNT STATIC FILES ------------------- -# Suppose your static files are located in "app/static" static_dir_path = os.path.join(os.path.dirname(__file__), "..", "static") app.mount("/static", StaticFiles(directory=static_dir_path), name="static") diff --git a/app/backend/routes/auth.py b/app/backend/routes/auth.py index b93bff5c44c89acaaeac96780bf458a9d0edb51d..a49f5a62ec0b8cccfca57e0e9db8d8726e20233c 100644 --- a/app/backend/routes/auth.py +++ b/app/backend/routes/auth.py @@ -77,7 +77,9 @@ def get_user_profile(current_user: User = Depends(get_current_user)): @router.put("/update") def update_user_profile( - user_data: dict, current_user: User = Depends(get_current_user), session: Session = Depends(get_session) + user_data: dict, + current_user: User = Depends(get_current_user), + session: Session = Depends(get_session), ): """Update the current user's profile information""" # Update user fields @@ -87,9 +89,9 @@ def update_user_profile( current_user.email = user_data["email"] if "phone" in user_data: current_user.phone_number = user_data["phone"] - + session.add(current_user) session.commit() session.refresh(current_user) - + return {"message": "Profile updated successfully"} diff --git a/app/backend/utils/hashing.py b/app/backend/utils/hashing.py index e538ce0f88d1d28105447c4d0c04a9f6b1cbc2f8..336fe4cf13c277e4c1436c5e7ca1607cdd4fa1bb 100644 --- a/app/backend/utils/hashing.py +++ b/app/backend/utils/hashing.py @@ -36,7 +36,7 @@ def decode_token(token: str) -> int: # Remove "Bearer " prefix if present if token.startswith("Bearer "): token = token[7:] - + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) print(f"Decoded payload: {payload}") user_id = payload.get("sub") diff --git a/app/frontend/components/user_details.py b/app/frontend/components/user_details.py index 1425340d15efeac68ec2461095577fa39acf818f..fdd14fca2b9bd229a548801d05f718092df95977 100644 --- a/app/frontend/components/user_details.py +++ b/app/frontend/components/user_details.py @@ -147,17 +147,21 @@ def user_details_frame(parent, switch_func, API_URL, token): row = ctk.CTkFrame(parent, fg_color="transparent", height=50) row.pack(fill="x", pady=(0, 15)) row.pack_propagate(False) - + label = ctk.CTkLabel( - row, text=label_text, font=("Helvetica", 14, "bold"), text_color="white", width=120 + row, + text=label_text, + font=("Helvetica", 14, "bold"), + text_color="white", + width=120, ) label.pack(side="left", anchor="w") - + value = ctk.CTkLabel( row, text=value_text, font=("Helvetica", 14), text_color="white" ) value.pack(side="left", padx=(20, 0), anchor="w") - + return value # Return so we can update it later # Create view mode fields @@ -209,18 +213,18 @@ def user_details_frame(parent, switch_func, API_URL, token): def enable_edit_mode(): view_frame.pack_forget() edit_frame.pack(fill="both", expand=True) - + # Copy data from view to edit mode fields username_entry.delete(0, "end") username_entry.insert(0, username_view.cget("text")) - + name_entry.delete(0, "end") name_entry.insert(0, name_view.cget("text")) - + email_entry.delete(0, "end") email_entry.insert(0, email_view.cget("text")) email_entry.configure(state="disabled") # Make email field read-only - + phone_entry.delete(0, "end") phone_entry.insert(0, phone_view.cget("text")) @@ -248,20 +252,22 @@ def user_details_frame(parent, switch_func, API_URL, token): payload = { "username": username_entry.get().strip(), "name": name_entry.get().strip(), # Backend ignores this field - "phone": phone_entry.get().strip(), # Note: backend expects "phone", not "phone_number" + "phone": phone_entry.get().strip(), # Note: backend expects "phone", not "phone_number" # Email is intentionally omitted from the payload to prevent changes } try: resp = requests.put(f"{API_URL}/user/update", headers=headers, json=payload) if resp.status_code == 200: messagebox.showinfo("Success", "Profile updated successfully!") - + # Update the view labels with new data username_view.configure(text=payload["username"]) - name_view.configure(text=payload["name"]) # This will be updated to match username on next fetch + name_view.configure( + text=payload["name"] + ) # This will be updated to match username on next fetch # Email stays the same phone_view.configure(text=payload["phone"]) - + # Switch back to view mode cancel_edit() else: @@ -295,17 +301,21 @@ def user_details_frame(parent, switch_func, API_URL, token): def fetch_user_info(): headers = {"Authorization": f"Bearer {frame.token}"} - print(f"Fetching user info with token: {frame.token[:10] if frame.token else 'None'}") + print( + f"Fetching user info with token: {frame.token[:10] if frame.token else 'None'}" + ) try: resp = requests.get(f"{API_URL}/user/profile", headers=headers) print(f"User profile response: {resp.status_code}") if resp.status_code == 200: data = resp.json() print(f"User data received: {data}") - + # Update view mode displays username_view.configure(text=data.get("username", "")) - name_view.configure(text=data.get("name", "")) # This will be the username + name_view.configure( + text=data.get("name", "") + ) # This will be the username email_view.configure(text=data.get("email", "")) phone_view.configure(text=data.get("phone", "")) else: diff --git a/app/frontend/components/user_orders.py b/app/frontend/components/user_orders.py index 849256f215344a3062453aa042b6845098c3df4b..c8fadbea54447326a911dde1a09607dd4126c77d 100644 --- a/app/frontend/components/user_orders.py +++ b/app/frontend/components/user_orders.py @@ -136,7 +136,9 @@ def user_orders_frame(parent, switch_func, API_URL, token): try: headers = {"Authorization": f"Bearer {frame.token}"} - print(f"Loading orders with token: {frame.token[:10] if frame.token else 'None'}") + print( + f"Loading orders with token: {frame.token[:10] if frame.token else 'None'}" + ) response = requests.get(f"{API_URL}/order/list", headers=headers) print(f"Orders response status: {response.status_code}") diff --git a/app/frontend/components/user_payments.py b/app/frontend/components/user_payments.py index 488d54459bf64653624760cc0f9e5c435d5c1593..7fb28d9be183d168671bc7095f482c4464dccddf 100644 --- a/app/frontend/components/user_payments.py +++ b/app/frontend/components/user_payments.py @@ -429,7 +429,9 @@ def user_payments_frame(parent, switch_func, API_URL, token): try: headers = {"Authorization": f"Bearer {frame.token}"} - print(f"Refreshing payments with token: {frame.token[:10] if frame.token else 'None'}") + print( + f"Refreshing payments with token: {frame.token[:10] if frame.token else 'None'}" + ) response = requests.get(f"{API_URL}/payment/user", headers=headers) print(f"Payments response status: {response.status_code}") diff --git a/app/frontend/utils/api_requests.py b/app/frontend/utils/api_requests.py index 16048686199cdc9a7567245d8ed5b141e28490b7..644e4a1f22fc65add763d6161f8e17ada833894e 100644 --- a/app/frontend/utils/api_requests.py +++ b/app/frontend/utils/api_requests.py @@ -21,7 +21,9 @@ def login_api(email, password, api_url): print(f"Login response status: {response.status_code}") if response.status_code == 200: data = response.json() - print(f"Login successful, token received: {data.get('access_token')[:10]}...") + print( + f"Login successful, token received: {data.get('access_token')[:10]}..." + ) return response.status_code, data return response.status_code, response.json() except requests.exceptions.RequestException as e: