Files
wecom_it_smart_desk/backend/app/api/service_routes.py
T

194 lines
6.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 企微IT智能服务台 — 服务路由定义
# =============================================================================
# 说明:根据 SERVICE_NAME 环境变量定义各服务需要加载的路由
# 支持 5 种服务:core, conversation, agent, ai, admin
# 不设置 SERVICE_NAME 时加载全部路由(向后兼容)
# =============================================================================
import os
from typing import Dict, List, Tuple
from fastapi import APIRouter
# 路由模块导入
from app.api import (
wecom_callback,
conversations,
messages,
agents,
quick_replies,
h5,
agent_notes,
system,
wingman,
todo_items,
troubleshooting_templates,
employees,
upload,
admin_api,
portal,
admin_roles,
approval,
wecom_jsapi,
auth_qrcode,
high_risk_routes,
mfa,
auth_wecom_sso,
audit_logs,
)
# admin 子目录的路由需要单独导入
from app.api.admin.security_comparison import router as security_comparison_router
# MFA 有两个 router,需要特殊处理
_MFA_ROUTER = mfa.router
_MFA_ADMIN_ROUTER = mfa.admin_router
# 路由定义:模块名 -> (router对象, tags, prefix)
# prefix 为空时使用路由对象默认的 prefix
_ROUTE_MODULES = {
# 企微回调
"wecom_callback": (wecom_callback.router, ["企微回调"], None),
# 会话管理
"conversations": (conversations.router, ["会话管理"], None),
"messages": (messages.router, ["消息管理"], None),
# 坐席管理
"agents": (agents.router, ["坐席管理"], None),
"quick_replies": (quick_replies.router, ["快速回复"], None),
# H5 用户端
"h5": (h5.router, ["H5用户端"], None),
# 坐席备注
"agent_notes": (agent_notes.router, ["坐席备注"], None),
# 系统管理
"system": (system.router, ["系统管理"], None),
# AI Wingman
"wingman": (wingman.router, ["AI Wingman"], None),
# 待办事项
"todo_items": (todo_items.router, ["待办事项"], None),
# 排查模板
"troubleshooting_templates": (troubleshooting_templates.router, ["排查模板"], None),
# 员工管理
"employees": (employees.router, ["员工管理"], None),
# 文件上传
"upload": (upload.router, ["文件上传"], None),
# 管理后台
"admin_api": (admin_api.router, ["管理后台"], None),
# Portal 统一入口
"portal": (portal.router, ["统一入口"], None),
# 角色管理
"admin_roles": (admin_roles.router, ["角色管理"], None),
# 审批流程
"approval": (approval.router, ["审批流程"], None),
# 企微 JS-SDK
"wecom_jsapi": (wecom_jsapi.router, ["企微JS-SDK"], None),
# 扫码登录
"auth_qrcode": (auth_qrcode.router, ["扫码登录"], None),
# 高危操作
"high_risk_routes": (high_risk_routes.router, ["高危操作"], None),
# MFA 二次认证(用户端和管理端分开)
"mfa": (_MFA_ROUTER, ["MFA二次认证"], None),
"mfa_admin": (_MFA_ADMIN_ROUTER, ["MFA管理(管理员)"], None),
# 企微 SSO
"auth_wecom_sso": (auth_wecom_sso.router, ["企微SSO"], None),
# 审计日志
"audit_logs": (audit_logs.router, ["审计日志"], None),
# 终端安全对比
"security_comparison": (security_comparison_router, ["终端安全对比"], None),
}
# 服务路由映射:服务名 -> 需要加载的路由模块列表
SERVICE_ROUTE_MAP: Dict[str, List[str]] = {
# Core 服务:核心服务(鉴权、员工、角色)
"core": [
"employees", # 员工管理
"auth_qrcode", # 扫码登录
"mfa", # MFA 二次认证
"auth_wecom_sso", # 企微 SSO
"portal", # 角色切换
],
# Conversation 服务:会话服务(会话、消息、H5、WebSocket
"conversation": [
"wecom_callback", # 企微消息接收
"conversations", # 会话管理
"messages", # 消息管理
"h5", # H5 用户端
"todo_items", # 待办事项
"troubleshooting_templates", # 排查模板
],
# Agent 服务:坐席服务
"agent": [
"agents", # 坐席管理
"quick_replies", # 快速回复
"agent_notes", # 坐席备注
"approval", # 审批流程
],
# AI 服务:AI 服务(Dify 调用、Wingman
"ai": [
"wingman", # AI Wingman
],
# Admin 服务:管理服务(仪表盘、配置、集成、审核)
"admin": [
"admin_api", # 管理后台 API(必须放第一个,因为 security_comparison 依赖它)
"admin_roles", # 角色管理
"audit_logs", # 审计日志
"high_risk_routes", # 高危操作
"system", # 系统管理
"upload", # 文件上传
"wecom_jsapi", # 企微 JS-SDK
"security_comparison", # 终端安全对比
"mfa_admin", # MFA 管理端
],
}
def get_routes_for_service(service_name: str) -> List[Tuple]:
"""根据服务名获取需要加载的路由列表
Args:
service_name: 服务名 (core/conversation/agent/ai/admin) 或 None/空
Returns:
路由元组列表:[(router, tags, prefix), ...]
"""
# 不设置 SERVICE_NAME 或设置为 "all" 时,加载全部路由(向后兼容)
if not service_name or service_name.lower() == "all":
return [
(_ROUTE_MODULES[name][0], _ROUTE_MODULES[name][1], _ROUTE_MODULES[name][2])
for name in _ROUTE_MODULES.keys()
]
# 根据服务名获取路由列表
route_names = SERVICE_ROUTE_MAP.get(service_name.lower(), [])
# 查找并返回路由对象
result = []
for name in route_names:
if name in _ROUTE_MODULES:
result.append((
_ROUTE_MODULES[name][0],
_ROUTE_MODULES[name][1],
_ROUTE_MODULES[name][2],
))
return result
def get_current_service_name() -> str:
"""获取当前服务名称
Returns:
SERVICE_NAME 环境变量,或空字符串
"""
return os.getenv("SERVICE_NAME", "")
def is_service_mode() -> bool:
"""判断是否处于服务模式(非单体模式)
Returns:
True 如果设置了有效的 SERVICE_NAME
"""
name = get_current_service_name()
return bool(name and name.lower() != "all")