Files
dpb/backend/app/api/v1/module_monitor/online/controller.py
T
34047007@qq.com c1fa752d9b checkpoint: require_redis 显式 503 守卫——存储类接口(AI配置/在线/缓存/验证码)接线
- dependencies: require_redis 改标准 FastAPI 依赖(Depends(redis_getter)),Redis 不可用显式 503 而非 500/静默空数据
- AI配置 5 端点 / 在线监控 5 端点 / 缓存监控 6 端点切到 require_redis
- 免认证验证码端点(captcha/get、slider/complete)也接线:Redis 挂时返回 503 而非 500
- login/token/oauth 保留 redis_getter(服务层内联 503 守卫语义不变)
2026-08-07 21:47:47 +08:00

69 lines
3.3 KiB
Python

from typing import Annotated
from fastapi import APIRouter, Body, Depends, Query, Security
from fastapi.responses import JSONResponse
from redis.asyncio.client import Redis
from sqlalchemy.ext.asyncio import AsyncSession
from app.common.request import PaginationService
from app.common.response import ResponseSchema, SuccessResponse
from app.core.base_schema import AuthSchema, PaginationQueryParam
from app.core.dependencies import AuthPermission, db_getter, get_current_user, require_redis
from app.core.router_class import OperationLogRoute
from .schema import DashboardStatsSchema, OnlineOutSchema, OnlineQueryParam
from .service import OnlineService
OnlineRouter = APIRouter(route_class=OperationLogRoute, prefix="/online", tags=["在线用户"])
@OnlineRouter.get("/list", summary="获取在线用户列表", response_model=ResponseSchema[list[OnlineOutSchema]], dependencies=[Security(AuthPermission(["module_monitor:online:query"]))])
async def get_online_list_controller(
redis: Annotated[Redis, Depends(require_redis)],
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[OnlineQueryParam, Query()],
) -> JSONResponse:
result_dict_list = await OnlineService.get_online_list(redis=redis, search=search)
result_dict = await PaginationService.paginate(
data_list=result_dict_list,
page_no=page.page_no,
page_size=page.page_size,
)
return SuccessResponse(data=result_dict, msg="获取成功")
@OnlineRouter.get("/current", summary="获取当前用户的在线会话", response_model=ResponseSchema[list[OnlineOutSchema]], dependencies=[Depends(get_current_user)])
async def get_current_online_controller(
redis: Annotated[Redis, Depends(require_redis)],
auth: Annotated[AuthSchema, Depends(get_current_user)],
) -> JSONResponse:
sessions = await OnlineService.get_current_user_sessions(redis=redis, user_id=auth.user.id)
return SuccessResponse(data=sessions, msg="获取当前用户在线会话成功")
@OnlineRouter.delete("/delete", summary="强制下线", response_model=ResponseSchema[None], dependencies=[Security(AuthPermission(["module_monitor:online:delete"]))])
async def delete_online_controller(
session_id: Annotated[str, Body(description="会话编号")],
redis: Annotated[Redis, Depends(require_redis)],
) -> JSONResponse:
await OnlineService.delete_online(redis=redis, session_id=session_id)
return SuccessResponse(msg="强制下线成功")
@OnlineRouter.delete("/clear", summary="清除所有在线用户", response_model=ResponseSchema[None], dependencies=[Security(AuthPermission(["module_monitor:online:delete"]))])
async def clear_online_controller(
redis: Annotated[Redis, Depends(require_redis)],
) -> JSONResponse:
await OnlineService.clear_online(redis=redis)
return SuccessResponse(msg="清除所有在线用户成功")
@OnlineRouter.get("/stats", summary="获取仪表盘统计数据", response_model=ResponseSchema[DashboardStatsSchema])
async def get_dashboard_stats_controller(
db: Annotated[AsyncSession, Depends(db_getter)],
redis: Annotated[Redis, Depends(require_redis)],
_auth: Annotated[AuthSchema, Security(AuthPermission(["module_monitor:dashboard:query"]))],
) -> JSONResponse:
data = await OnlineService.get_dashboard_stats(db=db, redis=redis)
return SuccessResponse(data=data, msg="获取仪表盘统计成功")