47 lines
1.6 KiB
Python
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)
|