Files
geozoner-back/app/routers/zones.py
Redsandy 3ea4fb4771 init
2026-03-14 18:48:57 +03:00

87 lines
2.5 KiB
Python

import uuid
import json
from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select
from app.database import get_session
from app.models.user import User
from app.models.zone import Zone
from app.models.friendship import Friendship
from app.schemas.zone import ZoneRead, ZoneBrief
from app.auth.dependencies import get_current_user
from app.services.geo_pipeline import wkt_to_geojson
router = APIRouter(prefix="/zones", tags=["zones"])
@router.get("", response_model=list[ZoneBrief])
def list_my_zones(
current_user: User = Depends(get_current_user),
session: Session = Depends(get_session),
):
"""Return all zones owned by the current user."""
zones = session.exec(select(Zone).where(Zone.owner_id == current_user.id)).all()
return [
ZoneBrief(
id=z.id,
owner_id=z.owner_id,
polygon_geojson=wkt_to_geojson(z.polygon_wkt),
area_m2=z.area_m2,
defense_level=z.defense_level,
)
for z in zones
]
@router.get("/friends", response_model=list[ZoneBrief])
def list_friend_zones(
current_user: User = Depends(get_current_user),
session: Session = Depends(get_session),
):
"""Return all zones owned by friends of the current user."""
friend_ids = session.exec(
select(Friendship.friend_id).where(Friendship.user_id == current_user.id)
).all()
if not friend_ids:
return []
zones = session.exec(
select(Zone).where(Zone.owner_id.in_(friend_ids)) # type: ignore[union-attr]
).all()
return [
ZoneBrief(
id=z.id,
owner_id=z.owner_id,
polygon_geojson=wkt_to_geojson(z.polygon_wkt),
area_m2=z.area_m2,
defense_level=z.defense_level,
)
for z in zones
]
@router.get("/{zone_id}", response_model=ZoneRead)
def get_zone(
zone_id: uuid.UUID,
current_user: User = Depends(get_current_user),
session: Session = Depends(get_session),
):
zone = session.get(Zone, zone_id)
if not zone:
raise HTTPException(status_code=404, detail="Zone not found")
return ZoneRead(
id=zone.id,
owner_id=zone.owner_id,
activity_id=zone.activity_id,
polygon_geojson=wkt_to_geojson(zone.polygon_wkt),
area_m2=zone.area_m2,
defense_level=zone.defense_level,
defense_runs=zone.defense_runs,
created_at=zone.created_at,
last_reinforced_at=zone.last_reinforced_at,
)