Files
2026-07-08 14:24:50 +08:00

58 lines
1.8 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_db, get_current_user
from app.models.user import User
from app.models.menu_config import MenuConfig
router = APIRouter(tags=["menu-configs"])
@router.get("/menu-configs")
async def public_list_menu_configs(
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
"""Public endpoint: list active menu configs for frontend (frontend + both)."""
result = await db.execute(
select(MenuConfig)
.where(
MenuConfig.is_active == True,
MenuConfig.menu_target.in_(["frontend", "both"]),
)
.order_by(MenuConfig.sort_order)
)
all_menus = result.scalars().all()
# Filter menus based on user permissions
# Show default menus + user-specific allowed menus (merged)
user_allowed_paths = set(current_user.allowed_menus or [])
# Start with default menus
allowed_ids = set()
for menu in all_menus:
if menu.is_default:
allowed_ids.add(menu.id)
if menu.parent_id:
allowed_ids.add(menu.parent_id)
# Add user-specific allowed menus (merge with defaults)
for menu in all_menus:
if menu.path in user_allowed_paths:
allowed_ids.add(menu.id)
if menu.parent_id:
allowed_ids.add(menu.parent_id)
menus = [m for m in all_menus if m.id in allowed_ids]
return [
{
"id": m.id, "label": m.label, "path": m.path, "icon": m.icon,
"sort_order": m.sort_order, "is_active": m.is_active,
"parent_id": m.parent_id, "menu_type": m.menu_type, "menu_target": m.menu_target,
"is_default": m.is_default,
}
for m in menus
]