Spaces:
Running
Running
| """Personalization API endpoints.""" | |
| from typing import Optional, Dict, Any | |
| from fastapi import APIRouter, HTTPException | |
| from pydantic import BaseModel | |
| from src.config.translations import get_supported_languages, is_rtl_language | |
| router = APIRouter(prefix="/personalization", tags=["personalization"]) | |
| # In-memory storage for demonstration (in production, use a database) | |
| user_preferences = {} | |
| class BookmarkCreate(BaseModel): | |
| """Bookmark creation model.""" | |
| content_reference: str | |
| title: Optional[str] = None | |
| notes: Optional[str] = None | |
| class PreferenceUpdate(BaseModel): | |
| """Preference update model.""" | |
| language: Optional[str] = None | |
| theme: Optional[str] = None | |
| settings: Optional[dict] = None | |
| async def get_bookmarks(user_id: str = "demo-user"): | |
| """Get user bookmarks.""" | |
| # Initialize user if not exists | |
| if user_id not in user_preferences: | |
| user_preferences[user_id] = { | |
| "language": "en", | |
| "theme": "light", | |
| "settings": {}, | |
| "bookmarks": [] | |
| } | |
| user_data = user_preferences[user_id] | |
| return { | |
| "user_id": user_id, | |
| "bookmarks": user_data.get("bookmarks", []), | |
| } | |
| async def create_bookmark(bookmark: BookmarkCreate, user_id: str = "demo-user"): | |
| """Create a new bookmark.""" | |
| # Initialize user if not exists | |
| if user_id not in user_preferences: | |
| user_preferences[user_id] = { | |
| "language": "en", | |
| "theme": "light", | |
| "settings": {}, | |
| "bookmarks": [] | |
| } | |
| bookmark_id = f"bookmark_{len(user_preferences[user_id]['bookmarks']) + 1}" | |
| new_bookmark = { | |
| "id": bookmark_id, | |
| "content_reference": bookmark.content_reference, | |
| "title": bookmark.title, | |
| "notes": bookmark.notes | |
| } | |
| user_preferences[user_id]["bookmarks"].append(new_bookmark) | |
| return { | |
| "success": True, | |
| "bookmark_id": bookmark_id, | |
| "message": "Bookmark created", | |
| "bookmark": new_bookmark | |
| } | |
| async def get_preferences(user_id: str = "demo-user"): | |
| """Get user preferences.""" | |
| # Initialize user if not exists | |
| if user_id not in user_preferences: | |
| user_preferences[user_id] = { | |
| "language": "en", | |
| "theme": "light", | |
| "settings": {}, | |
| "bookmarks": [] | |
| } | |
| user_data = user_preferences[user_id] | |
| # Add language information | |
| supported = get_supported_languages() | |
| current_language_info = { | |
| "code": user_data["language"], | |
| "name": supported.get(user_data["language"], "Unknown"), | |
| "is_rtl": is_rtl_language(user_data["language"]), | |
| "supported": user_data["language"] in supported | |
| } | |
| return { | |
| "user_id": user_id, | |
| "language": user_data["language"], | |
| "language_info": current_language_info, | |
| "theme": user_data["theme"], | |
| "settings": user_data["settings"], | |
| "supported_languages": list(supported.keys()), | |
| } | |
| async def update_preferences(prefs: PreferenceUpdate, user_id: str = "demo-user"): | |
| """Update user preferences with validation.""" | |
| # Initialize user if not exists | |
| if user_id not in user_preferences: | |
| user_preferences[user_id] = { | |
| "language": "en", | |
| "theme": "light", | |
| "settings": {}, | |
| "bookmarks": [] | |
| } | |
| # Validate language if provided | |
| if prefs.language is not None: | |
| supported = get_supported_languages() | |
| if prefs.language not in supported: | |
| raise HTTPException( | |
| status_code=400, | |
| detail=f"Language '{prefs.language}' is not supported. Supported languages: {list(supported.keys())}" | |
| ) | |
| user_preferences[user_id]["language"] = prefs.language | |
| # Update theme if provided | |
| if prefs.theme is not None: | |
| user_preferences[user_id]["theme"] = prefs.theme | |
| # Update settings if provided | |
| if prefs.settings is not None: | |
| user_preferences[user_id]["settings"] = {**user_preferences[user_id]["settings"], **prefs.settings} | |
| # Get updated language information | |
| updated_language = user_preferences[user_id]["language"] | |
| supported = get_supported_languages() | |
| language_info = { | |
| "code": updated_language, | |
| "name": supported.get(updated_language, "Unknown"), | |
| "is_rtl": is_rtl_language(updated_language), | |
| "supported": updated_language in supported | |
| } | |
| return { | |
| "success": True, | |
| "message": "Preferences updated", | |
| "updated_preferences": { | |
| "language": user_preferences[user_id]["language"], | |
| "language_info": language_info, | |
| "theme": user_preferences[user_id]["theme"], | |
| "settings": user_preferences[user_id]["settings"] | |
| } | |
| } | |
| async def personalization_health(): | |
| """Check personalization service health.""" | |
| supported = get_supported_languages() | |
| return { | |
| "status": "healthy", | |
| "service": "personalization", | |
| "features": { | |
| "user_preferences": True, | |
| "language_support": True, | |
| "urdu_support": "ur" in supported, | |
| "roman_urdu_support": "ur-PK" in supported, | |
| "rtl_layout": True | |
| } | |
| } | |