summit/backend/app/services/crud_route.py

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