import uuid from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.db.session import get_db from app.models.ausgabe import Ausgabe, AusgabeStatus from app.models.auth import Benutzer from app.schemas.ausgabe import AusgabeCreate, AusgabeRead from app.services.ausgabe import AusgabeBereitsZurueckError, ausgeben, zurueckgeben router = APIRouter() @router.get("/ausgaben", response_model=list[AusgabeRead]) async def liste_ausgaben( status_filter: AusgabeStatus | None = None, empfaenger_id: int | None = None, db: AsyncSession = Depends(get_db), _=Depends(get_current_user), ) -> list[Ausgabe]: stmt = select(Ausgabe) if status_filter is not None: stmt = stmt.where(Ausgabe.status == status_filter) if empfaenger_id is not None: stmt = stmt.where(Ausgabe.empfaenger_id == empfaenger_id) stmt = stmt.order_by(Ausgabe.ausgegeben_am.desc()) result = await db.execute(stmt) return list(result.scalars().all()) @router.post("/ausgaben", response_model=AusgabeRead, status_code=status.HTTP_201_CREATED) async def erstelle_ausgabe( payload: AusgabeCreate, db: AsyncSession = Depends(get_db), current_user: Benutzer = Depends(get_current_user), ) -> Ausgabe: return await ausgeben( db, material_id=payload.material_id, geraet_instanz_id=payload.geraet_instanz_id, menge=payload.menge, empfaenger_id=payload.empfaenger_id, ausgegeben_von=current_user.id, zweck=payload.zweck, ) @router.post("/ausgaben/{ausgabe_id}/rueckgabe", response_model=AusgabeRead) async def route_rueckgabe( ausgabe_id: uuid.UUID, db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> Ausgabe: ausgabe = await db.get(Ausgabe, ausgabe_id) if ausgabe is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ausgabe nicht gefunden") try: return await zurueckgeben(db, ausgabe=ausgabe) except AusgabeBereitsZurueckError as exc: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Ausgabe wurde bereits zurückgegeben" ) from exc