| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- from typing import List
- from fastapi import APIRouter, Depends, HTTPException, status
- from sqlalchemy.orm import Session
- from app.database import get_db
- from app.core.deps import require_roles, get_current_user
- from app.models.user import User
- from app.schemas.common import ApiResponse
- from app.schemas.menu import MenuCreate, MenuUpdate, MenuOut
- from app.services.menu import MenuService
- router = APIRouter(prefix="/api/menus", tags=["菜单管理"])
- @router.get("/mine", response_model=ApiResponse[List[MenuOut]])
- def get_my_menus(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
- tree = MenuService.get_user_menu_tree(db, current_user)
- return ApiResponse(data=tree)
- @router.get("/tree", response_model=ApiResponse[List[MenuOut]])
- def get_menu_tree(db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- tree = MenuService.get_menu_tree(db)
- return ApiResponse(data=tree)
- @router.get("/role/{role_id}", response_model=ApiResponse[List[MenuOut]])
- def get_menus_by_role(role_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- menus = MenuService.get_menus_by_role(db, role_id)
- return ApiResponse(data=[MenuOut.model_validate(m) for m in menus])
- @router.get("/{menu_id}", response_model=ApiResponse[MenuOut])
- def get_menu(menu_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- menu = MenuService.get_by_id(db, menu_id)
- if not menu:
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="菜单不存在")
- return ApiResponse(data=MenuOut.model_validate(menu))
- @router.post("/", response_model=ApiResponse[MenuOut])
- def create_menu(body: MenuCreate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- data = body.model_dump(exclude_unset=True)
- menu = MenuService.create(db, data)
- return ApiResponse(data=MenuOut.model_validate(menu))
- @router.put("/{menu_id}", response_model=ApiResponse[MenuOut])
- def update_menu(menu_id: int, body: MenuUpdate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- data = body.model_dump(exclude_unset=True)
- menu = MenuService.update(db, menu_id, data)
- if not menu:
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="菜单不存在")
- return ApiResponse(data=MenuOut.model_validate(menu))
- @router.delete("/{menu_id}", response_model=ApiResponse[None])
- def delete_menu(menu_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- MenuService.soft_delete(db, menu_id)
- return ApiResponse(data=None)
|