Files
bacchus/apps/backend/app/api/categories.py
2025-09-28 19:13:01 +02:00

86 lines
2.2 KiB
Python

# app/routes/categories.py
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.core.database import SessionLocal
from app.core.auth import get_current_user, requires_role
from app.models.user import User
from app.models.product import Product
router = APIRouter(prefix="/categories", tags=["categories"])
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@router.get("/", response_model=list[str])
def list_categories(db: Session = Depends(get_db)):
"""
Alle Kategorien (distinct aus Product.category).
"""
cats = db.query(Product.category).distinct().all()
return sorted([c[0] for c in cats if c[0]])
@router.put(
"/rename",
dependencies=[Depends(requires_role("manager", "admin"))],
)
def rename_category(
old_name: str,
new_name: str,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
"""
Kategorie umbenennen: alle Produkte mit old_name -> new_name.
"""
if not new_name or new_name.lower() == "alle":
raise HTTPException(status_code=400, detail="Invalid category name")
updated = (
db.query(Product)
.filter(Product.category == old_name)
.update({"category": new_name})
)
if updated == 0:
raise HTTPException(status_code=404, detail="Category not found")
db.commit()
return {"updated": updated, "new_name": new_name}
@router.delete(
"/",
dependencies=[Depends(requires_role("manager", "admin"))],
)
def delete_category(
name: str,
reassign_to: str | None = None,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
):
"""
Kategorie löschen.
- Mit reassign_to: alle Produkte auf neue Kategorie umhängen.
- Ohne: Kategorie auf NULL setzen.
"""
q = db.query(Product).filter(Product.category == name)
if not q.first():
raise HTTPException(status_code=404, detail="Category not found")
if reassign_to:
updated = q.update({"category": reassign_to})
else:
updated = q.update({"category": None})
db.commit()
return {"updated": updated, "reassigned_to": reassign_to}