Files
company-ai-platform/app/modules/legacy_mysql/routes.py
JiuContinent 4d09d8e2e3 ```
feat: 添加仪表板路由和响应数据脱敏功能

- 添加了仪表板模块路由并集成到主路由器中
- 实现了敏感数据响应脱敏配置和功能
- 增加了 Feishu 审批卡片操作处理功能
- 支持通过任务队列异步推送日常简报和项目周报
- 添加了风险事件生成的任务队列支持
- 在 smoke 测试中增加了相关功能验证

refactor: 格式化模型注册模块导入列表

- 将单行导入列表改为多行格式以提高可读性
```
2026-07-07 18:33:07 +08:00

61 lines
1.9 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.masking import mask_configured
from app.core.security import ApiPrincipal, require_api_key
from app.modules.legacy_mysql.schemas import (
LegacyProjectSyncRequest,
LegacyProjectSyncResult,
QueryResult,
ReadonlyQueryRequest,
)
from app.modules.legacy_mysql.service import LegacyMySQLService
router = APIRouter(dependencies=[Depends(require_api_key)])
@router.get("/health")
def mysql_health(
db: Session = Depends(get_db),
) -> dict[str, str]:
return LegacyMySQLService(db).health()
@router.post("/query", response_model=QueryResult)
def readonly_query(
payload: ReadonlyQueryRequest,
db: Session = Depends(get_db),
) -> dict:
service = LegacyMySQLService(db)
if payload.sql:
result = service.execute_readonly(payload.sql, payload.params, payload.limit)
else:
result = service.execute_allowed_query(payload.query_name, payload.params, payload.limit)
return mask_configured(result)
@router.get("/projects", response_model=QueryResult)
def default_project_query(
limit: int = Query(default=100, ge=1, le=500),
db: Session = Depends(get_db),
) -> dict:
return mask_configured(LegacyMySQLService(db).fetch_default_projects(limit=limit))
@router.post("/projects/sync", response_model=LegacyProjectSyncResult)
def sync_projects(
payload: LegacyProjectSyncRequest,
db: Session = Depends(get_db),
principal: ApiPrincipal = Depends(require_api_key),
) -> dict:
result = LegacyMySQLService(db).sync_projects(
source_query=payload.source_query,
source_query_name=payload.source_query_name,
field_map=payload.field_map,
limit=payload.limit,
dry_run=payload.dry_run,
actor=principal.actor,
)
return mask_configured(result)