import type { LastLevelRouteKey } from '@elegant-router/types'; import { SYSTEM_SERVICE_PREFIX } from '@/constants/service'; import { request } from '../request'; import type { ServiceRequestResult } from './shared'; type BackendMenuRoute = Omit & { id: string | number; children?: BackendMenuRoute[]; }; interface BackendUserRouteDTO { routes?: BackendMenuRoute[] | null; home?: string | null; } let userRoutePromise: Promise> | null = null; export function clearUserRouteCache() { userRoutePromise = null; } function normalizeMenuRoute(route: BackendMenuRoute): Api.Route.MenuRoute { return { ...route, id: String(route.id), children: route.children?.map(child => normalizeMenuRoute(child)) }; } function normalizeUserRoute(data: BackendUserRouteDTO): Api.Route.UserRoute { return { routes: (data.routes ?? []).map(route => normalizeMenuRoute(route)), home: (data.home || 'system_user') as LastLevelRouteKey }; } /** 获取常量路由 */ export function fetchGetConstantRoutes() { return request({ url: '/route/getConstantRoutes' }); } /** 获取用户路由 */ export async function fetchGetUserRoutes(force = false): Promise> { if (!userRoutePromise || force) { userRoutePromise = request({ url: `${SYSTEM_SERVICE_PREFIX}/auth/get-user-routes` }).then(result => result as ServiceRequestResult); } const result = await userRoutePromise; if (result.error || !result.data) { userRoutePromise = null; return result as ServiceRequestResult; } return { ...result, data: normalizeUserRoute(result.data) }; } /** * 判断路由是否存在 * * @param routeName 路由名称 */ export async function fetchIsRouteExist(routeName: string): Promise> { const result = await fetchGetUserRoutes(); if (result.error || !result.data) { return { ...result, data: false } as unknown as ServiceRequestResult; } const isExist = result.data.routes.some(route => recursiveIsRouteExist(route, routeName)); return { ...result, data: isExist }; } function recursiveIsRouteExist(route: Api.Route.MenuRoute, routeName: string): boolean { if (route.name === routeName) { return true; } return route.children?.some(child => recursiveIsRouteExist(child, routeName)) || false; }