Spaces:
Running
Running
from fastapi import APIRouter, Depends, HTTPException, Body | |
from pydantic import BaseModel, EmailStr, validator | |
from typing import Optional | |
from werkzeug.security import generate_password_hash | |
from app.database.database_query import DatabaseQuery | |
from app.middleware.auth import get_current_user | |
router = APIRouter() | |
query = DatabaseQuery() | |
class ProfileUpdateRequest(BaseModel): | |
email: Optional[EmailStr] = None | |
password: Optional[str] = None | |
name: Optional[str] = None | |
age: Optional[int] = None | |
def password_length(cls, v): | |
if v is not None and len(v) < 6: | |
raise ValueError('Password must be at least 6 characters') | |
return v | |
def age_range(cls, v): | |
if v is not None and (v < 13 or v > 120): | |
raise ValueError('Age must be between 13 and 120') | |
return v | |
async def get_profile(username: str = Depends(get_current_user)): | |
try: | |
user = query.get_user_profile(username) | |
if not user: | |
raise HTTPException(status_code=404, detail="User not found") | |
return { | |
'username': user['username'], | |
'email': user['email'], | |
'name': user['name'], | |
'age': user['age'], | |
'created_at': user['created_at'] | |
} | |
except Exception as e: | |
if isinstance(e, HTTPException): | |
raise e | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def update_profile( | |
update_data: ProfileUpdateRequest = Body(...), | |
username: str = Depends(get_current_user) | |
): | |
try: | |
update_fields = {} | |
if update_data.email: | |
if not query.is_valid_email(update_data.email): | |
raise HTTPException(status_code=400, detail="Invalid email format") | |
update_fields['email'] = update_data.email | |
if update_data.password: | |
update_fields['password'] = generate_password_hash(update_data.password) | |
if update_data.name: | |
update_fields['name'] = update_data.name | |
if update_data.age is not None: | |
update_fields['age'] = update_data.age | |
if update_fields: | |
if query.update_user_profile(username, update_fields): | |
return {"message": "Profile updated successfully"} | |
return {"message": "No changes made"} | |
except Exception as e: | |
if isinstance(e, HTTPException): | |
raise e | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def delete_account(username: str = Depends(get_current_user)): | |
try: | |
if query.delete_user_account(username): | |
return {"message": "Account deleted successfully"} | |
raise HTTPException(status_code=404, detail="User not found") | |
except Exception as e: | |
if isinstance(e, HTTPException): | |
raise e | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def delete_account_permanently(username: str = Depends(get_current_user)): | |
try: | |
result = query.delete_account_permanently(username) | |
if result['success']: | |
return { | |
'message': 'Account and all associated data deleted successfully', | |
'details': result['deleted_data'] | |
} | |
else: | |
raise HTTPException(status_code=500, detail="Failed to delete account") | |
except Exception as e: | |
if isinstance(e, HTTPException): | |
raise e | |
raise HTTPException(status_code=500, detail=str(e)) |