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, )