summit/backend/app/services/crud_route.py

36 lines
1.2 KiB
Python
Raw Normal View History

2025-12-08 16:31:30 +00:00
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()