98 lines
3.4 KiB
Python
98 lines
3.4 KiB
Python
"""
|
||
Settings API endpoints.
|
||
|
||
Управление настройками пользователя для всех трех окружений (IFT, PSI, PROD).
|
||
"""
|
||
|
||
from fastapi import APIRouter, Depends, HTTPException, status
|
||
from app.models.settings import UserSettings, UserSettingsUpdate
|
||
from app.interfaces.db_api_client import DBApiClient
|
||
from app.dependencies import get_db_client, get_current_user
|
||
import httpx
|
||
import logging
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
router = APIRouter(prefix="/settings", tags=["settings"])
|
||
|
||
|
||
@router.get("", response_model=UserSettings)
|
||
async def get_settings(
|
||
current_user: dict = Depends(get_current_user),
|
||
db_client: DBApiClient = Depends(get_db_client)
|
||
):
|
||
"""
|
||
Получить настройки пользователя для всех окружений.
|
||
|
||
Returns:
|
||
UserSettings: Настройки пользователя для IFT, PSI, PROD
|
||
"""
|
||
user_id = current_user["user_id"]
|
||
|
||
try:
|
||
settings = await db_client.get_user_settings(user_id)
|
||
return settings
|
||
except httpx.HTTPStatusError as e:
|
||
if e.response.status_code == 404:
|
||
raise HTTPException(
|
||
status_code=status.HTTP_404_NOT_FOUND,
|
||
detail="User settings not found"
|
||
)
|
||
logger.error(f"Failed to get user settings: {e}")
|
||
raise HTTPException(
|
||
status_code=status.HTTP_502_BAD_GATEWAY,
|
||
detail="Failed to retrieve settings from DB API"
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Unexpected error getting user settings: {e}")
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Internal server error"
|
||
)
|
||
|
||
|
||
@router.patch("", response_model=UserSettings)
|
||
async def update_settings(
|
||
settings_update: UserSettingsUpdate,
|
||
current_user: dict = Depends(get_current_user),
|
||
db_client: DBApiClient = Depends(get_db_client)
|
||
):
|
||
"""
|
||
Частично обновить настройки пользователя.
|
||
|
||
Обновляются только переданные поля. Непереданные поля остаются без изменений.
|
||
|
||
Args:
|
||
settings_update: Частичные настройки для одного или нескольких окружений
|
||
|
||
Returns:
|
||
UserSettings: Обновленные настройки со всеми полями
|
||
"""
|
||
user_id = current_user["user_id"]
|
||
|
||
try:
|
||
updated_settings = await db_client.update_user_settings(user_id, settings_update)
|
||
return updated_settings
|
||
except httpx.HTTPStatusError as e:
|
||
if e.response.status_code == 404:
|
||
raise HTTPException(
|
||
status_code=status.HTTP_404_NOT_FOUND,
|
||
detail="User not found"
|
||
)
|
||
elif e.response.status_code == 400:
|
||
raise HTTPException(
|
||
status_code=status.HTTP_400_BAD_REQUEST,
|
||
detail="Invalid settings format"
|
||
)
|
||
logger.error(f"Failed to update user settings: {e}")
|
||
raise HTTPException(
|
||
status_code=status.HTTP_502_BAD_GATEWAY,
|
||
detail="Failed to update settings in DB API"
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Unexpected error updating user settings: {e}")
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Internal server error"
|
||
)
|