Files
vector/backend/main.py
T
Sadmin 98e8e58023 feat: водоёмы в зоне поиска на карте (рекомендации профилей → геослой)
- GET /api/v1/water/{case_id}: полигоны водоёмов/болот OSM вокруг ТНП
  (Overpass, natural=water+wetland, кэш 72ч, circuit breaker от geo_service);
  бейдж-предупреждение по профилям случая (РАС/эпилепсия/не умеет плавать)
- geo_service: цепочка зеркал Overpass (maps.mail.ru → overpass-api.de):
  основной сервер имеет AAAA, на хостах без IPv6-маршрута httpx падал
  ConnectError'ом до IPv4-фолбэка; на CT108 фапало стабильно
- SearchMap: слой водоёмов под зонами (синие полигоны, болота пунктиром),
  попапы с площадью/дистанцией от ТНП; AnalysisResult грузит слой,
  показывает предупреждение профиля и счётчик водоёмов
- проверено на CT108: РАС-кейс (Минск) — 43 объекта, витя-кейс
  (Каменец-борисовская обл.) — 7 объектов, включая водохранилище Загацце
2026-09-09 12:48:44 +03:00

61 lines
1.8 KiB
Python

from __future__ import annotations
import os
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from backend.database import init_db
from backend.routers.admin import router as admin_router
from backend.routers.analyze import router as analyze_router
from backend.routers.auth import router as auth_router
from backend.routers.cases import router as cases_router
from backend.routers.closed_cases import router as closed_cases_router
from backend.routers.health import router as health_router
from backend.routers.stats import router as stats_router
from backend.routers.water import router as water_router
def _parse_origins(value: str) -> list[str]:
origins = [origin.strip() for origin in value.split(',') if origin.strip()]
return origins or ['http://localhost:3000', 'http://127.0.0.1:3000']
cors_origins = _parse_origins(os.getenv('CORS_ORIGINS', 'http://localhost:3000,http://127.0.0.1:3000'))
allow_credentials = os.getenv('CORS_ALLOW_CREDENTIALS', 'true').strip().lower() in {'1', 'true', 'yes', 'on'}
if '*' in cors_origins:
allow_credentials = False
@asynccontextmanager
async def lifespan(app: FastAPI):
init_db()
yield
app = FastAPI(title='Vector API', version='0.1.0', lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=cors_origins,
allow_credentials=allow_credentials,
allow_methods=['*'],
allow_headers=['*'],
)
app.include_router(health_router)
app.include_router(auth_router)
app.include_router(analyze_router)
app.include_router(cases_router)
app.include_router(closed_cases_router)
app.include_router(stats_router)
app.include_router(admin_router)
app.include_router(water_router)
@app.get('/')
def root() -> dict[str, str]:
return {'name': 'Vector API', 'status': 'ok'}