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, require_roles from app.db.session import get_db from app.models.auth import RolleTyp from app.models.stammdaten import Bereich, Kategorie, Material, Objekttyp, Standort from app.schemas.stammdaten import ( BereichCreate, BereichRead, KategorieCreate, KategorieRead, MaterialCreate, MaterialRead, MaterialUpdate, ObjekttypCreate, ObjekttypRead, StandortCreate, StandortRead, ) router = APIRouter() # -- Bereich ------------------------------------------------------------------ @router.get("/bereiche", response_model=list[BereichRead]) async def liste_bereiche( db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> list[Bereich]: result = await db.execute(select(Bereich)) return list(result.scalars().all()) @router.post("/bereiche", response_model=BereichRead, status_code=status.HTTP_201_CREATED) async def erstelle_bereich( payload: BereichCreate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Bereich: bereich = Bereich(**payload.model_dump()) db.add(bereich) await db.flush() return bereich # -- Kategorie ------------------------------------------------------------------ @router.get("/kategorien", response_model=list[KategorieRead]) async def liste_kategorien( db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> list[Kategorie]: result = await db.execute(select(Kategorie)) return list(result.scalars().all()) @router.post("/kategorien", response_model=KategorieRead, status_code=status.HTTP_201_CREATED) async def erstelle_kategorie( payload: KategorieCreate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Kategorie: kategorie = Kategorie(**payload.model_dump()) db.add(kategorie) await db.flush() return kategorie # -- Standort ------------------------------------------------------------------ @router.get("/standorte", response_model=list[StandortRead]) async def liste_standorte( db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> list[Standort]: result = await db.execute(select(Standort)) return list(result.scalars().all()) @router.post("/standorte", response_model=StandortRead, status_code=status.HTTP_201_CREATED) async def erstelle_standort( payload: StandortCreate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Standort: standort = Standort(**payload.model_dump()) db.add(standort) await db.flush() return standort # -- Objekttyp ------------------------------------------------------------------ @router.get("/objekttypen", response_model=list[ObjekttypRead]) async def liste_objekttypen( db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> list[Objekttyp]: result = await db.execute(select(Objekttyp)) return list(result.scalars().all()) @router.post("/objekttypen", response_model=ObjekttypRead, status_code=status.HTTP_201_CREATED) async def erstelle_objekttyp( payload: ObjekttypCreate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Objekttyp: objekttyp = Objekttyp(**payload.model_dump()) db.add(objekttyp) await db.flush() return objekttyp # -- Material (Prompt 07) -------------------------------------------------- @router.get("/materialien", response_model=list[MaterialRead]) async def liste_materialien( db: AsyncSession = Depends(get_db), _=Depends(get_current_user) ) -> list[Material]: result = await db.execute(select(Material)) return list(result.scalars().all()) @router.get("/materialien/{material_id}", response_model=MaterialRead) async def hole_material( material_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_user), ) -> Material: material = await db.get(Material, material_id) if material is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Material nicht gefunden") return material @router.post("/materialien", response_model=MaterialRead, status_code=status.HTTP_201_CREATED) async def erstelle_material( payload: MaterialCreate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Material: material = Material(**payload.model_dump()) db.add(material) await db.flush() return material @router.patch("/materialien/{material_id}", response_model=MaterialRead) async def aendere_material( material_id: int, payload: MaterialUpdate, db: AsyncSession = Depends(get_db), _=Depends(require_roles(RolleTyp.administration)), ) -> Material: material = await db.get(Material, material_id) if material is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Material nicht gefunden") for feld, wert in payload.model_dump(exclude_unset=True).items(): setattr(material, feld, wert) await db.flush() return material