init
This commit is contained in:
86
app/routers/zones.py
Normal file
86
app/routers/zones.py
Normal file
@@ -0,0 +1,86 @@
|
||||
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,
|
||||
)
|
||||
Reference in New Issue
Block a user