from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List, Any, Optional from app.core.deps import get_db, get_current_user_token from app.menu.models import GrpMenuAccess router = APIRouter(tags=["Menu & Navigation"]) @router.get("/fndMenu/menuloadbyuser") @router.get("/MenuAccess/set_menu_for_user") def menu_load_by_user( db: Session = Depends(get_db), token_payload: Optional[dict] = Depends(get_current_user_token) ): """ Returns menu hierarchy matching Spring Boot's LoadMenuController /menuloadbyuser. Fetches all root menu items (menu_id = 0) and attaches their corresponding submenus. """ usr_grp = 1 if token_payload: usr_grp = token_payload.get("user_grp", 1) # 1. Fetch root menus (menu_id == 0) roots = db.query(GrpMenuAccess).filter( GrpMenuAccess.menu_id == 0, GrpMenuAccess.usr_grp == usr_grp, GrpMenuAccess.status == "A" ).order_by(GrpMenuAccess.item_seq).all() response_list = [] for r in roots: # 2. Fetch submenus for each root submenus = db.query(GrpMenuAccess).filter( GrpMenuAccess.menu_id == r.menu_item_id, GrpMenuAccess.usr_grp == usr_grp, GrpMenuAccess.status == "A" ).order_by(GrpMenuAccess.item_seq).all() sub_list = [] for s in submenus: sub_list.append({ "id": s.id, "menuId": s.menu_id, "menuItemId": s.menu_item_id, "menuItemDesc": s.menu_item_desc, "moduleName": s.module_name, "main_menu_action_name": s.main_menu_action_name, "main_menu_icon_name": s.main_menu_icon_name, "itemSeq": s.item_seq, "status": s.status, "role": s.role, "mCreate": s.m_create, "mEdit": s.m_edit, "mQuery": s.m_query, "mDelete": s.m_delete, "mexport": s.m_export, "mVisible": s.m_visible }) response_list.append({ "id": r.id, "menuId": r.menu_id, "menuItemId": r.menu_item_id, "menuItemDesc": r.menu_item_desc, "moduleName": r.module_name, "main_menu_action_name": r.main_menu_action_name, "main_menu_icon_name": r.main_menu_icon_name, "itemSeq": r.item_seq, "status": r.status, "role": r.role, "subMenus": sub_list }) return response_list @router.get("/fndMenu/listofusrgrp") def list_of_usr_grp(db: Session = Depends(get_db)): """Returns all distinct user groups.""" return [{"usrGrp": 1, "groupName": "Admin Group"}]