From 33329b7d03ee0f11f81078a18440ecfcebb13409 Mon Sep 17 00:00:00 2001 From: Felix Zett Date: Sat, 9 Aug 2025 15:07:32 +0200 Subject: [PATCH] Add trip management routes and functionality --- backend/main.py | 2 + backend/routes/trips.py | 116 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 backend/routes/trips.py diff --git a/backend/main.py b/backend/main.py index e14dcfc..7237294 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,10 +1,12 @@ from fastapi import FastAPI from routes.items import router as items_router +from routes.trips import router as trips_router from models import Base from database import engine app = FastAPI() app.include_router(items_router) +app.include_router(trips_router) @app.on_event("startup") async def startup(): diff --git a/backend/routes/trips.py b/backend/routes/trips.py new file mode 100644 index 0000000..a82f0a0 --- /dev/null +++ b/backend/routes/trips.py @@ -0,0 +1,116 @@ +import re +from uuid import UUID, uuid4 +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from schemas import TripCreate +from models import Item, Trip, TripItem +from database import get_db +from sqlalchemy import select +from sqlalchemy.orm import selectinload +from config import FIXED_USER_ID + +router = APIRouter() + +@router.post("/trips/") +async def create_trip(trip: TripCreate, db: AsyncSession = Depends(get_db)): + user_id = FIXED_USER_ID + + db_trip = Trip( + id=uuid4(), + name=trip.name, + user_id=user_id, + start_date=trip.start_date, + end_date=trip.end_date, + selected_tags=trip.selected_tags, + marked_tags=trip.marked_tags + ) + + await db.commit() # damit ID vorhanden ist + db.add(db_trip) + + # Tage berechnen + days = (trip.end_date - trip.start_date).days + 1 + nights = days - 1 + + # relevante Items + result = await db.execute(select(Item).where(Item.user_id == user_id)) + all_items = result.scalars().all() + + trip_items = [] + + for item in all_items: + item_tag_names = [tag.name for tag in item.tags] + + if not set(item_tag_names).issubset(set(trip.selected_tags)): + continue + + item_text = replace_placeholders(item.name, days, nights) + + # markierte Tags matchen? + matching_marked = set(item_tag_names) & set(trip.marked_tags) + + if matching_marked: + for tag in matching_marked: + trip_items.append(TripItem( + id=uuid4(), + trip_id=db_trip.id, + item_id=item.id, + tag=tag, + name=item.name, + calculated_label=item_text, + checked=False + )) + else: + trip_items.append(TripItem( + id=uuid4(), + trip_id=db_trip.id, + item_id=item.id, + tag=None, + name=item.name, + calculated_label=item_text, + checked=False + )) + + db.add_all(trip_items) + await db.commit() + return {"status": "trip created", "trip_id": str(db_trip.id)} + + +@router.get("/trips/{trip_id}/items") +async def get_trip_items(trip_id: UUID, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(TripItem).where(TripItem.trip_id == trip_id)) + items = result.scalars().all() + return [ + { + "label": item.calculated_label, + "tag": item.tag, + "checked": item.checked + } for item in items + ] + +@router.get("/trips/") +async def get_trips(db: AsyncSession = Depends(get_db)): + user_id = FIXED_USER_ID + result = await db.execute(select(Trip).where(Trip.user_id == user_id)) + trips = result.scalars().all() + return [ + { + "id": str(trip.id), + "name": trip.name, + "start_date": trip.start_date, + "end_date": trip.end_date, + "selected_tags": trip.selected_tags, + "marked_tags": trip.marked_tags + } for trip in trips + ] + +def replace_placeholders(text: str, days: int, nights: int) -> str: + def replacer(match): + expr = match.group(1) + expr = expr.replace("days", str(days)).replace("nights", str(nights)) + try: + return str(eval(expr)) + except: + return match.group(0) + + return re.sub(r"{(.*?)}", replacer, text) \ No newline at end of file