/** 用户菜单授权数据加载适配(任务 49):拉取可授权菜单树 + 用户已授权 id。 */ import { http } from '@/api/http' import { unwrap } from '@/api/envelope' import { ADMIN_MENU_TYPE, APP_MENU_TYPE, buildMenuOptionTree, buildUserColumnPermissionPayload, normalizeMenuIds, parseMenuOptionList, parseUserGrantedColumnIds, type MenuOptionNode, } from './user-menu-auth' export const GRANT_MENUS_ENDPOINT = '/api/admin/permission-menus' export const USER_PERMISSION_COLUMNS_ENDPOINT = '/api/admin/permission-users' /** 拉取可授权菜单树(后台 admin + 前端客户端 app 两类合并,按 sort 排序)。 */ export async function fetchGrantableMenus(): Promise { const [adminRes, appRes] = await Promise.all([ http.get(GRANT_MENUS_ENDPOINT, { params: { menuType: ADMIN_MENU_TYPE } }), http.get(GRANT_MENUS_ENDPOINT, { params: { menuType: APP_MENU_TYPE } }), ]) const nodes = [ ...parseMenuOptionList(adminRes.data, ADMIN_MENU_TYPE), ...parseMenuOptionList(appRes.data, APP_MENU_TYPE), ] return buildMenuOptionTree(nodes) } /** 拉取某用户当前直接授权菜单 id 列表(admin + app 合并去重)。 */ export async function fetchUserGrantedColumnIds(userId: number): Promise { const [adminRes, appRes] = await Promise.all([ http.get(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, { params: { menuType: ADMIN_MENU_TYPE }, }), http.get(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, { params: { menuType: APP_MENU_TYPE }, }), ]) return normalizeMenuIds([ ...parseUserGrantedColumnIds(adminRes.data), ...parseUserGrantedColumnIds(appRes.data), ]) } /** 编辑用户菜单授权所需数据:可选菜单树 + 已勾选 id。 */ export interface UserMenuAuthData { tree: MenuOptionNode[] checkedIds: number[] } export async function loadUserMenuAuth(userId: number): Promise { const [tree, checkedIds] = await Promise.all([fetchGrantableMenus(), fetchUserGrantedColumnIds(userId)]) return { tree, checkedIds } } /** 提交某用户的直接授权菜单 id(整树替换);success=false 由 unwrap 抛后端 message。 */ export async function submitUserMenuAuth(userId: number, columnIds: unknown): Promise { const payload = buildUserColumnPermissionPayload(columnIds) const { data } = await http.put(`${USER_PERMISSION_COLUMNS_ENDPOINT}/${userId}/columns`, payload, { params: { menuType: ADMIN_MENU_TYPE }, }) unwrap(data) }