Initial commit: svg backend
This commit is contained in:
88
backend/app/api/routes/test_mode.py
Normal file
88
backend/app/api/routes/test_mode.py
Normal file
@@ -0,0 +1,88 @@
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
|
||||
from app.core.config import settings
|
||||
from app.repositories.pricing import find_effective_price_rule
|
||||
from app.repositories.scheme_seats import get_scheme_version_seat_by_seat_id
|
||||
from app.repositories.scheme_versions import get_current_scheme_version
|
||||
from app.repositories.schemes import get_scheme_record_by_scheme_id
|
||||
from app.schemas.test_mode import TestSeatPreviewResponse
|
||||
from app.security.auth import require_api_key
|
||||
|
||||
router = APIRouter()
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@router.get(f"{settings.api_v1_prefix}/schemes/{{scheme_id}}/test/seats/{{seat_id}}", response_model=TestSeatPreviewResponse)
|
||||
async def preview_test_seat(
|
||||
scheme_id: str,
|
||||
seat_id: str,
|
||||
role: str = Depends(require_api_key),
|
||||
):
|
||||
scheme = await get_scheme_record_by_scheme_id(scheme_id)
|
||||
version = await get_current_scheme_version(
|
||||
scheme_id=scheme.scheme_id,
|
||||
current_version_number=scheme.current_version_number,
|
||||
)
|
||||
seat = await get_scheme_version_seat_by_seat_id(
|
||||
scheme_version_id=version.scheme_version_id,
|
||||
seat_id=seat_id,
|
||||
)
|
||||
|
||||
if not seat.seat_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
detail="Невозможно построить preview: у места отсутствует seat_id",
|
||||
)
|
||||
|
||||
matched_rule_level = None
|
||||
matched_target_ref = None
|
||||
pricing_category_id = None
|
||||
amount = None
|
||||
currency = None
|
||||
has_price = False
|
||||
|
||||
try:
|
||||
matched_rule_level, rule = await find_effective_price_rule(
|
||||
scheme_id=scheme.scheme_id,
|
||||
seat_id=seat.seat_id,
|
||||
group_id=seat.group_id,
|
||||
sector_id=seat.sector_id,
|
||||
)
|
||||
matched_target_ref = rule["target_ref"]
|
||||
pricing_category_id = rule["pricing_category_id"]
|
||||
amount = rule["amount"]
|
||||
currency = rule["currency"]
|
||||
has_price = True
|
||||
except HTTPException as exc:
|
||||
if exc.status_code != status.HTTP_404_NOT_FOUND:
|
||||
raise
|
||||
except Exception as exc:
|
||||
logger.exception(
|
||||
"preview_test_seat failed for scheme_id=%s seat_id=%s",
|
||||
scheme_id,
|
||||
seat_id,
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
detail=f"Не удалось построить preview: {exc.__class__.__name__}: {exc}",
|
||||
)
|
||||
|
||||
return TestSeatPreviewResponse(
|
||||
scheme_id=scheme.scheme_id,
|
||||
scheme_version_id=version.scheme_version_id,
|
||||
seat_id=seat.seat_id,
|
||||
element_id=seat.element_id,
|
||||
sector_id=seat.sector_id,
|
||||
group_id=seat.group_id,
|
||||
row_label=seat.row_label,
|
||||
seat_number=seat.seat_number,
|
||||
selectable=has_price,
|
||||
has_price=has_price,
|
||||
matched_rule_level=matched_rule_level,
|
||||
matched_target_ref=matched_target_ref,
|
||||
pricing_category_id=pricing_category_id,
|
||||
amount=amount,
|
||||
currency=currency,
|
||||
)
|
||||
Reference in New Issue
Block a user