36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
from typing import List, Optional
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import selectinload
|
|
from app.models.route import Route
|
|
from app.schemas.route import RouteCreate
|
|
from geoalchemy2.shape import from_shape
|
|
from shapely.geometry import shape
|
|
|
|
class CRUDRoute:
|
|
async def get_by_peak(self, db: AsyncSession, peak_id: int) -> List[Route]:
|
|
# Use selectinload to fetch related camps efficiently
|
|
result = await db.execute(
|
|
select(Route)
|
|
.filter(Route.peak_id == peak_id)
|
|
.options(selectinload(Route.camps))
|
|
)
|
|
return result.scalars().all()
|
|
|
|
async def create(self, db: AsyncSession, *, obj_in: RouteCreate) -> Route:
|
|
geom_wkt = from_shape(shape(obj_in.path_geometry), srid=4326)
|
|
|
|
db_obj = Route(
|
|
peak_id=obj_in.peak_id,
|
|
name=obj_in.name,
|
|
difficulty=obj_in.difficulty,
|
|
description=obj_in.description,
|
|
is_standard_route=obj_in.is_standard_route,
|
|
path_geometry=geom_wkt
|
|
)
|
|
db.add(db_obj)
|
|
await db.commit()
|
|
await db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
route = CRUDRoute() |