60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|||
|
from sqlalchemy.orm import Session
|
|||
|
from typing import List
|
|||
|
|
|||
|
from app.schemas.calculation import CalculationCreate, CalculationRead
|
|||
|
from app.services import calculation_service as service
|
|||
|
from app.db.session import get_db
|
|||
|
|
|||
|
router = APIRouter(
|
|||
|
prefix="/calculation", # Общий префикс для эндпоинтов этого роутера
|
|||
|
tags=["Calculations"], # Тег для группировки в документации Swagger
|
|||
|
)
|
|||
|
|
|||
|
@router.post("/", response_model=CalculationRead, status_code=status.HTTP_201_CREATED)
|
|||
|
async def run_calculation(
|
|||
|
calc_in: CalculationCreate,
|
|||
|
db: Session = Depends(get_db)
|
|||
|
):
|
|||
|
"""
|
|||
|
Запускает новый расчет раскройки стекла (асинхронно).
|
|||
|
|
|||
|
- Принимает `input_params` и опционально `model_name`.
|
|||
|
- Вызывает внутреннюю асинхронную логику расчета (заглушку).
|
|||
|
- Сохраняет входные параметры и результаты в БД.
|
|||
|
- Возвращает созданную запись о расчете.
|
|||
|
"""
|
|||
|
print("Received request to run calculation")
|
|||
|
calculation = await service.create_calculation(db=db, calc_in=calc_in)
|
|||
|
print("Calculation service finished, returning response")
|
|||
|
return calculation
|
|||
|
|
|||
|
@router.get("/{calculation_id}", response_model=CalculationRead)
|
|||
|
async def read_calculation(
|
|||
|
calculation_id: int,
|
|||
|
db: Session = Depends(get_db)
|
|||
|
):
|
|||
|
"""
|
|||
|
Получает информацию о конкретном расчете по его ID.
|
|||
|
"""
|
|||
|
db_calc = service.get_calculation_by_id(db=db, calc_id=calculation_id)
|
|||
|
if db_calc is None:
|
|||
|
raise HTTPException(
|
|||
|
status_code=status.HTTP_404_NOT_FOUND,
|
|||
|
detail="Calculation not found"
|
|||
|
)
|
|||
|
return db_calc
|
|||
|
|
|||
|
# Определяем эндпоинт для истории до эндпоинта с ID,
|
|||
|
# чтобы FastAPI не принял "history" за ID
|
|||
|
@router.get("/history/", response_model=List[CalculationRead])
|
|||
|
async def read_calculation_history(
|
|||
|
skip: int = 0,
|
|||
|
limit: int = 100,
|
|||
|
db: Session = Depends(get_db)
|
|||
|
):
|
|||
|
"""
|
|||
|
Получает историю всех выполненных расчетов (с пагинацией).
|
|||
|
"""
|
|||
|
calculations = service.get_calculations(db=db, skip=skip, limit=limit)
|
|||
|
return calculations
|