from fastapi import APIRouter, Query from sqlalchemy import select from ..dependencies import Db from ..models import Bait, CatchReport, Fish, ModerationStatus, Spot, Waterbody from ..schemas import BaitOut, FishOut, WaterbodyOut router = APIRouter() @router.get("/api/v1/fishes", response_model=list[FishOut]) def fishes(db: Db, limit: int = Query(200, ge=1, le=500), offset: int = Query(0, ge=0)) -> list[Fish]: return list(db.scalars(select(Fish).order_by(Fish.name_ru, Fish.id).offset(offset).limit(limit))) @router.get("/api/v1/waterbodies", response_model=list[WaterbodyOut]) def waterbodies(db: Db, limit: int = Query(200, ge=1, le=500), offset: int = Query(0, ge=0)) -> list[Waterbody]: return list(db.scalars(select(Waterbody).order_by(Waterbody.name_ru, Waterbody.id).offset(offset).limit(limit))) @router.get("/api/v1/baits", response_model=list[BaitOut]) def baits(db: Db, limit: int = Query(200, ge=1, le=500), offset: int = Query(0, ge=0)) -> list[Bait]: return list(db.scalars(select(Bait).order_by(Bait.name, Bait.id).offset(offset).limit(limit))) @router.get("/api/v1/public-spot-pages") def public_spot_pages(db: Db, limit: int = Query(500, ge=1, le=500), offset: int = Query(0, ge=0)) -> list[str]: rows = db.execute(select(Waterbody.slug, Spot.x, Spot.y, Fish.slug) .select_from(CatchReport).join(Spot, CatchReport.spot_id == Spot.id) .join(Waterbody, Spot.waterbody_id == Waterbody.id).join(Fish, CatchReport.fish_id == Fish.id) .where(CatchReport.moderation_status == ModerationStatus.approved, CatchReport.deleted_at.is_(None)) .distinct().order_by(Waterbody.slug, Spot.x, Spot.y, Fish.slug).offset(offset).limit(limit)) return [path for water, x, y, fish in rows for path in (f"/spots/{water}-{x}x{y}", f"/waterbodies/{water}/{fish}")]