from fastapi import APIRouter, Depends, HTTPException, Request from sqlalchemy.orm import Session from typing import List from ..database import get_db from ..models import Menu, User from ..schemas import MenuCreate, MenuUpdate, MenuResponse from .auth import get_current_admin, get_current_user router = APIRouter(prefix="/api/admin/menus", tags=["admin"]) public_router = APIRouter(prefix="/api/menus", tags=["menus"]) @router.get("", response_model=List[MenuResponse]) def list_menus(db: Session = Depends(get_db), admin_user: User = Depends(get_current_admin)): menus = db.query(Menu).order_by(Menu.sort_order).all() return [MenuResponse.model_validate(m) for m in menus] @public_router.get("/active", response_model=List[MenuResponse]) def get_active_menus(request: Request, db: Session = Depends(get_db)): try: user = get_current_user(request, db) role = user.role except Exception: role = None menus = db.query(Menu).filter(Menu.is_active == True).order_by(Menu.sort_order).all() result = [] for m in menus: allowed_roles = m.roles or [] if not allowed_roles or (role and role in allowed_roles): result.append(MenuResponse.model_validate(m)) return result @router.post("", response_model=MenuResponse) def create_menu(data: MenuCreate, request: Request, db: Session = Depends(get_db), admin_user: User = Depends(get_current_admin)): menu = Menu(**data.model_dump()) db.add(menu) db.commit() db.refresh(menu) return MenuResponse.model_validate(menu) @router.put("/{menu_id}", response_model=MenuResponse) def update_menu(menu_id: int, data: MenuUpdate, request: Request, db: Session = Depends(get_db), admin_user: User = Depends(get_current_admin)): menu = db.query(Menu).filter(Menu.id == menu_id).first() if not menu: raise HTTPException(status_code=404, detail="菜单不存在") update_data = data.model_dump(exclude_unset=True) for key, val in update_data.items(): setattr(menu, key, val) db.commit() db.refresh(menu) return MenuResponse.model_validate(menu) @router.delete("/{menu_id}") def delete_menu(menu_id: int, request: Request, db: Session = Depends(get_db), admin_user: User = Depends(get_current_admin)): menu = db.query(Menu).filter(Menu.id == menu_id).first() if not menu: raise HTTPException(status_code=404, detail="菜单不存在") if menu.children: raise HTTPException(status_code=400, detail="请先删除子菜单") db.delete(menu) db.commit() return {"message": "删除成功"}