evolution-todo-api / routes /preferences.py
Asma-yaseen's picture
feat: Deploy all advanced endpoints - Phase 2 complete
80df84c
Raw
History Blame Contribute Delete
3.45 kB
"""
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
@router.get("/{user_id}/preferences")
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
@router.put("/{user_id}/preferences")
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