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 ]