new init
This commit is contained in:
85
apps/backend/app/api/categories.py
Normal file
85
apps/backend/app/api/categories.py
Normal file
@@ -0,0 +1,85 @@
|
||||
# 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}
|
Reference in New Issue
Block a user