96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends, Request
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import get_api_current_user
|
|
from app.api.errors import ApiException
|
|
from app.api.responses import success_payload
|
|
from app.api.schemas import SettingsEnvelope, SettingsUpdateRequest
|
|
from app.db.models import User
|
|
from app.db.session import get_db_session
|
|
from app.services import user_settings as user_settings_service
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/settings", tags=["api-settings"])
|
|
|
|
|
|
def _serialize_settings(settings) -> dict[str, object]:
|
|
return {
|
|
"auto_run_enabled": bool(settings.auto_run_enabled),
|
|
"run_interval_minutes": int(settings.run_interval_minutes),
|
|
"request_delay_seconds": int(settings.request_delay_seconds),
|
|
}
|
|
|
|
|
|
@router.get(
|
|
"",
|
|
response_model=SettingsEnvelope,
|
|
)
|
|
async def get_settings(
|
|
request: Request,
|
|
db_session: AsyncSession = Depends(get_db_session),
|
|
current_user: User = Depends(get_api_current_user),
|
|
):
|
|
settings = await user_settings_service.get_or_create_settings(
|
|
db_session,
|
|
user_id=current_user.id,
|
|
)
|
|
return success_payload(
|
|
request,
|
|
data=_serialize_settings(settings),
|
|
)
|
|
|
|
|
|
@router.put(
|
|
"",
|
|
response_model=SettingsEnvelope,
|
|
)
|
|
async def update_settings(
|
|
payload: SettingsUpdateRequest,
|
|
request: Request,
|
|
db_session: AsyncSession = Depends(get_db_session),
|
|
current_user: User = Depends(get_api_current_user),
|
|
):
|
|
try:
|
|
parsed_interval = user_settings_service.parse_run_interval_minutes(
|
|
str(payload.run_interval_minutes)
|
|
)
|
|
parsed_delay = user_settings_service.parse_request_delay_seconds(
|
|
str(payload.request_delay_seconds)
|
|
)
|
|
except user_settings_service.UserSettingsServiceError as exc:
|
|
raise ApiException(
|
|
status_code=400,
|
|
code="invalid_settings",
|
|
message=str(exc),
|
|
) from exc
|
|
|
|
settings = await user_settings_service.get_or_create_settings(
|
|
db_session,
|
|
user_id=current_user.id,
|
|
)
|
|
updated = await user_settings_service.update_settings(
|
|
db_session,
|
|
settings=settings,
|
|
auto_run_enabled=bool(payload.auto_run_enabled),
|
|
run_interval_minutes=parsed_interval,
|
|
request_delay_seconds=parsed_delay,
|
|
)
|
|
logger.info(
|
|
"api.settings.updated",
|
|
extra={
|
|
"event": "api.settings.updated",
|
|
"user_id": current_user.id,
|
|
"auto_run_enabled": updated.auto_run_enabled,
|
|
"run_interval_minutes": updated.run_interval_minutes,
|
|
"request_delay_seconds": updated.request_delay_seconds,
|
|
},
|
|
)
|
|
return success_payload(
|
|
request,
|
|
data=_serialize_settings(updated),
|
|
)
|