alabuga/backend/app/api/routes/onboarding.py
2025-09-25 04:55:43 +02:00

61 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Онбординг и космический лор."""
from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from app.api.deps import get_current_user
from app.db.session import get_db
from app.models.user import User
from app.schemas.onboarding import (
OnboardingCompleteRequest,
OnboardingOverview,
OnboardingSlideRead,
OnboardingStateRead,
)
from app.services.onboarding import complete_slide, get_overview
router = APIRouter(prefix="/api/onboarding", tags=["onboarding"])
@router.get("/", response_model=OnboardingOverview, summary="Лор и прогресс онбординга")
def read_onboarding(
*,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> OnboardingOverview:
"""Отдаём все слайды вместе с состоянием пользователя."""
slides, state, next_order = get_overview(db, current_user)
return OnboardingOverview(
slides=[OnboardingSlideRead.model_validate(slide) for slide in slides],
state=OnboardingStateRead(
last_completed_order=state.last_completed_order,
is_completed=state.is_completed,
),
next_order=next_order,
)
@router.post("/complete", response_model=OnboardingStateRead, summary="Завершаем шаг онбординга")
def complete_onboarding_step(
payload: OnboardingCompleteRequest,
*,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> OnboardingStateRead:
"""Фиксируем прохождение очередного шага лора."""
try:
state = complete_slide(db, current_user, payload.order)
except ValueError as exc: # pragma: no cover - ошибка бизнес-логики
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc
return OnboardingStateRead(
last_completed_order=state.last_completed_order,
is_completed=state.is_completed,
)