guideCity/backend/app/api/routes/cities.py
vrubelroman be67902b45 Add structured logging throughout the backend
Request-level logging middleware (method/path/status/duration),
per-module loggers in routes/services (nearby search radius
expansion, 404s, name search), LOG_LEVEL setting wired through
docker-compose, and seed_loader converted from print() to logging.

Verified: pytest passes, and manually confirmed log lines appear for
both successful and 404 requests via `docker compose logs api`.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:10:10 +00:00

39 lines
1.1 KiB
Python

import logging
from fastapi import APIRouter, Depends
from geoalchemy2 import Geometry
from sqlalchemy import cast, func, select
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.models.city import City
from app.schemas.city import CityOut
from app.schemas.common import LatLon, LocalizedName
logger = logging.getLogger("guidecity.cities")
router = APIRouter(tags=["cities"])
@router.get("/cities", response_model=list[CityOut])
def list_cities(db: Session = Depends(get_db)) -> list[CityOut]:
stmt = select(
City,
func.ST_X(cast(City.center_point, Geometry)).label("lon"),
func.ST_Y(cast(City.center_point, Geometry)).label("lat"),
)
rows = db.execute(stmt).all()
out = []
for city, lon, lat in rows:
center = LatLon(lat=lat, lon=lon) if lat is not None and lon is not None else None
out.append(
CityOut(
id=city.id,
slug=city.slug,
name=LocalizedName(ru=city.name_ru, en=city.name_en),
center=center,
)
)
logger.debug("listed %d cities", len(out))
return out