fda82fe313
## 变更 - 权限目录新增一级分组“监控审计”,统一设备存活、埋点成功率、埋点日志和审计日志。 - 补齐 `analytics-health` 页面权限,技术角色默认拥有四项监控审计权限;运营默认仅保留设备存活。 - 新增服务端 `require_page` 守卫,四组 API 不再只依赖前端隐藏导航,直接调用也会校验角色或个人页面权限。 - 增加迁移,为存量技术角色补上 `analytics-health` 权限,并同步接口文档。 ## 验证 - 改动文件 `ruff check` 通过。 - `tests/test_admin_roles.py tests/test_analytics_health.py`: 24 passed。 - Alembic 从空库 upgrade 到 head,再 downgrade 本迁移:通过。 - 全量测试:443 passed、6 failed;6 项失败在干净 `origin/main` 上原样复现(主干为 442 passed、6 failed),与本 PR 无关。 --------- Co-authored-by: unknown <798648091@qq.com> Reviewed-on: #159 Co-authored-by: linkeyu <linkeyu@wonderable.ai> Co-committed-by: linkeyu <linkeyu@wonderable.ai>
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""admin 埋点健康度:埋点成功率 / 上报成功率 总览 + 趋势 + 下钻(只读)。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.admin.deps import AdminDb, require_page
|
|
from app.admin.repositories import analytics_health as repo
|
|
from app.admin.schemas.analytics_health import (
|
|
HealthBreakdownRow,
|
|
HealthMetrics,
|
|
HealthTrendPoint,
|
|
)
|
|
|
|
router = APIRouter(
|
|
prefix="/admin/api/analytics-health",
|
|
tags=["admin-analytics-health"],
|
|
dependencies=[Depends(require_page("analytics-health"))],
|
|
)
|
|
|
|
|
|
@router.get("/overview", response_model=HealthMetrics, summary="两段成功率总览")
|
|
def overview(
|
|
db: AdminDb,
|
|
date_from: Annotated[datetime, Query()],
|
|
date_to: Annotated[datetime, Query()],
|
|
) -> HealthMetrics:
|
|
return HealthMetrics(**repo.overview(db, date_from, date_to))
|
|
|
|
|
|
@router.get("/trend", response_model=list[HealthTrendPoint], summary="按北京天趋势")
|
|
def trend(
|
|
db: AdminDb,
|
|
date_from: Annotated[datetime, Query()],
|
|
date_to: Annotated[datetime, Query()],
|
|
) -> list[HealthTrendPoint]:
|
|
return [HealthTrendPoint(**p) for p in repo.trend(db, date_from, date_to)]
|
|
|
|
|
|
@router.get("/breakdown", response_model=list[HealthBreakdownRow], summary="按维度下钻")
|
|
def breakdown(
|
|
db: AdminDb,
|
|
date_from: Annotated[datetime, Query()],
|
|
date_to: Annotated[datetime, Query()],
|
|
dim: Annotated[str, Query(pattern="^(event|app_ver|oem)$")] = "event",
|
|
) -> list[HealthBreakdownRow]:
|
|
return [HealthBreakdownRow(**r) for r in repo.breakdown(db, date_from, date_to, dim)]
|