Spaces:
Runtime error
Runtime error
| """ | |
| User Preferences API (US9). | |
| Task: US9 - Settings management | |
| Spec: specs/database/schema.md | |
| """ | |
| from fastapi import APIRouter, Depends, HTTPException, status | |
| from sqlmodel import Session, select | |
| from typing import Optional | |
| from pydantic import BaseModel | |
| from datetime import datetime | |
| from models import UserPreferences | |
| from db import get_session | |
| from middleware.auth import verify_token | |
| router = APIRouter(prefix="/api", tags=["preferences"]) | |
| class PreferencesUpdate(BaseModel): | |
| """Request model for updating user preferences.""" | |
| theme: Optional[str] = None | |
| notifications_enabled: Optional[bool] = None | |
| notification_sound: Optional[bool] = None | |
| default_priority: Optional[str] = None | |
| default_view: Optional[str] = None | |
| language: Optional[str] = None | |
| timezone: Optional[str] = None | |
| async def get_user_preferences( | |
| user_id: str, | |
| session: Session = Depends(get_session), | |
| authenticated_user_id: str = Depends(verify_token) | |
| ): | |
| """ | |
| Retrieve user preferences (US9). | |
| Args: | |
| user_id: User ID from URL path | |
| session: Database session | |
| authenticated_user_id: User ID from JWT token | |
| Returns: | |
| UserPreferences object | |
| """ | |
| if user_id != authenticated_user_id: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="Forbidden" | |
| ) | |
| # Find preferences or create default | |
| prefs = session.get(UserPreferences, user_id) | |
| if not prefs: | |
| prefs = UserPreferences(user_id=user_id) | |
| session.add(prefs) | |
| session.commit() | |
| session.refresh(prefs) | |
| return prefs | |
| async def update_user_preferences( | |
| user_id: str, | |
| data: PreferencesUpdate, | |
| session: Session = Depends(get_session), | |
| authenticated_user_id: str = Depends(verify_token) | |
| ): | |
| """ | |
| Update user preferences (US9). | |
| Args: | |
| user_id: User ID from URL path | |
| data: Preferences to update | |
| session: Database session | |
| authenticated_user_id: User ID from JWT token | |
| Returns: | |
| Updated UserPreferences object | |
| """ | |
| if user_id != authenticated_user_id: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="Forbidden" | |
| ) | |
| # Find existing preferences | |
| prefs = session.get(UserPreferences, user_id) | |
| if not prefs: | |
| prefs = UserPreferences(user_id=user_id) | |
| # Update fields | |
| update_data = data.model_dump(exclude_unset=True) | |
| print(f"📝 Updating preferences for {user_id}:") | |
| print(f" Data received: {update_data}") | |
| # Validate language constraint | |
| if 'language' in update_data: | |
| allowed_languages = ['en', 'ur'] | |
| if update_data['language'] not in allowed_languages: | |
| error_msg = f"Invalid language '{update_data['language']}'. Allowed: {', '.join(allowed_languages)}" | |
| print(f"❌ {error_msg}") | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=error_msg | |
| ) | |
| for key, value in update_data.items(): | |
| setattr(prefs, key, value) | |
| prefs.updated_at = datetime.utcnow() | |
| session.add(prefs) | |
| session.commit() | |
| session.refresh(prefs) | |
| return prefs | |