menu.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from typing import List
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from sqlalchemy.orm import Session
  4. from app.database import get_db
  5. from app.core.deps import require_roles, get_current_user
  6. from app.models.user import User
  7. from app.schemas.common import ApiResponse
  8. from app.schemas.menu import MenuCreate, MenuUpdate, MenuOut
  9. from app.services.menu import MenuService
  10. router = APIRouter(prefix="/api/menus", tags=["菜单管理"])
  11. @router.get("/mine", response_model=ApiResponse[List[MenuOut]])
  12. def get_my_menus(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
  13. tree = MenuService.get_user_menu_tree(db, current_user)
  14. return ApiResponse(data=tree)
  15. @router.get("/tree", response_model=ApiResponse[List[MenuOut]])
  16. def get_menu_tree(db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  17. tree = MenuService.get_menu_tree(db)
  18. return ApiResponse(data=tree)
  19. @router.get("/role/{role_id}", response_model=ApiResponse[List[MenuOut]])
  20. def get_menus_by_role(role_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  21. menus = MenuService.get_menus_by_role(db, role_id)
  22. return ApiResponse(data=[MenuOut.model_validate(m) for m in menus])
  23. @router.get("/{menu_id}", response_model=ApiResponse[MenuOut])
  24. def get_menu(menu_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  25. menu = MenuService.get_by_id(db, menu_id)
  26. if not menu:
  27. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="菜单不存在")
  28. return ApiResponse(data=MenuOut.model_validate(menu))
  29. @router.post("/", response_model=ApiResponse[MenuOut])
  30. def create_menu(body: MenuCreate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  31. data = body.model_dump(exclude_unset=True)
  32. menu = MenuService.create(db, data)
  33. return ApiResponse(data=MenuOut.model_validate(menu))
  34. @router.put("/{menu_id}", response_model=ApiResponse[MenuOut])
  35. def update_menu(menu_id: int, body: MenuUpdate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  36. data = body.model_dump(exclude_unset=True)
  37. menu = MenuService.update(db, menu_id, data)
  38. if not menu:
  39. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="菜单不存在")
  40. return ApiResponse(data=MenuOut.model_validate(menu))
  41. @router.delete("/{menu_id}", response_model=ApiResponse[None])
  42. def delete_menu(menu_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  43. MenuService.soft_delete(db, menu_id)
  44. return ApiResponse(data=None)