Spaces:
Running
Running
| from fastapi import APIRouter, Depends, HTTPException, status | |
| from sqlalchemy.orm import Session | |
| from typing import Dict, Any, Optional | |
| from pydantic import BaseModel, EmailStr | |
| from core.database import get_db | |
| from services.auth_service import auth_service | |
| from api.deps import get_current_user | |
| from models.user import User | |
| router = APIRouter(prefix="/api/auth", tags=["auth"]) | |
| # Pydantic models | |
| class UserCreate(BaseModel): | |
| email: EmailStr | |
| password: str | |
| class UserLogin(BaseModel): | |
| email: EmailStr | |
| password: str | |
| class Token(BaseModel): | |
| access_token: str | |
| token_type: str | |
| user: dict | |
| class PasswordChange(BaseModel): | |
| old_password: str | |
| new_password: str | |
| class UserPreferences(BaseModel): | |
| tts_provider: str = "elevenlabs" | |
| auto_play_tts: bool = False | |
| other: Optional[Dict[str, Any]] = {} | |
| def register(user_in: UserCreate, db: Session = Depends(get_db)): | |
| """Register a new user""" | |
| try: | |
| user = auth_service.register_user(db, user_in.email, user_in.password) | |
| return {"message": "User registered successfully", "id": user.id, "email": user.email} | |
| except ValueError as e: | |
| raise HTTPException(status_code=400, detail=str(e)) | |
| def login(user_in: UserLogin, db: Session = Depends(get_db)): | |
| """Login and get token""" | |
| result = auth_service.authenticate_user(db, user_in.email, user_in.password) | |
| if not result: | |
| raise HTTPException( | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| detail="Incorrect email or password", | |
| headers={"WWW-Authenticate": "Bearer"}, | |
| ) | |
| return result | |
| def read_users_me(current_user: User = Depends(get_current_user)): | |
| """Get current user data""" | |
| return { | |
| "id": current_user.id, | |
| "email": current_user.email, | |
| "id": current_user.id, | |
| "email": current_user.email, | |
| "created_at": current_user.created_at, | |
| "preferences": current_user.preferences or {} | |
| } | |
| def update_preferences( | |
| prefs: UserPreferences, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| """Update user preferences""" | |
| # Initialize defaults if None | |
| current_prefs = dict(current_user.preferences) if current_user.preferences else {} | |
| # Update values | |
| current_prefs["tts_provider"] = prefs.tts_provider | |
| current_prefs["auto_play_tts"] = prefs.auto_play_tts | |
| if prefs.other: | |
| current_prefs.update(prefs.other) | |
| current_user.preferences = current_prefs | |
| db.commit() | |
| db.refresh(current_user) | |
| return {"message": "Preferences updated", "preferences": current_user.preferences} | |
| def change_password( | |
| password_data: PasswordChange, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| """Change user password""" | |
| try: | |
| auth_service.change_password( | |
| db, | |
| current_user.email, | |
| password_data.old_password, | |
| password_data.new_password | |
| ) | |
| return {"message": "Password updated successfully"} | |
| except ValueError as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=str(e) | |
| ) | |