alabuga/backend/app/api/routes/python.py
2025-09-29 11:59:25 -06:00

47 lines
1.6 KiB
Python

"""API для миссии "Основы Python"."""
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.mission import Mission
from app.models.user import User
from app.schemas.python import PythonMissionState, PythonSubmitRequest, PythonSubmissionRead
from app.services.python_mission import build_state, submit_code
router = APIRouter(prefix="/api/python-mission", tags=["python-mission"])
def _get_mission(db: Session, mission_id: int) -> Mission:
mission = db.query(Mission).filter(Mission.id == mission_id, Mission.is_active.is_(True)).first()
if not mission:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Миссия не найдена")
return mission
@router.get("/{mission_id}", response_model=PythonMissionState)
def mission_state(
mission_id: int,
*,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> PythonMissionState:
mission = _get_mission(db, mission_id)
return build_state(db, current_user, mission)
@router.post("/{mission_id}/submit", response_model=PythonSubmissionRead)
def mission_submit(
mission_id: int,
payload: PythonSubmitRequest,
*,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> PythonSubmissionRead:
mission = _get_mission(db, mission_id)
submission = submit_code(db, current_user, mission, challenge_id=payload.challenge_id, code=payload.code)
return PythonSubmissionRead.model_validate(submission)