""" 群组统计API接口 """ from typing import Optional from fastapi import APIRouter, HTTPException from pydantic import BaseModel from loguru import logger from app.services.group_stats_service import group_stats_service router = APIRouter() class GroupStatsResponse(BaseModel): """群组统计响应模型""" success: bool message: str data: dict class ClearStatsRequest(BaseModel): """清空统计请求模型""" group_id: str @router.get("/group-stats/{group_id}", response_model=GroupStatsResponse) async def get_group_stats(group_id: str): """ 获取指定群组的统计信息 Args: group_id: 群组ID Returns: 群组统计信息 """ try: stats_summary = group_stats_service.get_group_stats_summary(group_id) return GroupStatsResponse( success=True, message=f"获取群组统计信息成功: {group_id}", data=stats_summary ) except Exception as e: logger.error(f"获取群组统计信息失败: group_id={group_id}, error={str(e)}") raise HTTPException(status_code=500, detail=f"获取群组统计信息失败: {str(e)}") @router.get("/group-stats/{group_id}/most-active", response_model=GroupStatsResponse) async def get_most_active_user(group_id: str): """ 获取指定群组中发言次数最多的用户昵称 Args: group_id: 群组ID Returns: 最活跃用户信息 """ try: most_active_nickname = group_stats_service.get_most_active_user_nickname(group_id) message_stats = group_stats_service.get_group_message_stats(group_id) # 找到最活跃用户的详细信息 most_active_user_id = None max_count = 0 for user_id, count in message_stats.items(): if count > max_count: max_count = count most_active_user_id = user_id data = { "group_id": group_id, "most_active_nickname": most_active_nickname, "most_active_user_id": most_active_user_id, "message_count": max_count, "total_users": len([count for count in message_stats.values() if count > 0]) } return GroupStatsResponse( success=True, message=f"获取最活跃用户成功: {group_id}", data=data ) except Exception as e: logger.error(f"获取最活跃用户失败: group_id={group_id}, error={str(e)}") raise HTTPException(status_code=500, detail=f"获取最活跃用户失败: {str(e)}") @router.post("/group-stats/clear", response_model=GroupStatsResponse) async def clear_group_stats(request: ClearStatsRequest): """ 清空指定群组的统计数据 Args: request: 清空统计请求 Returns: 操作结果 """ try: success = group_stats_service.clear_group_stats(request.group_id) if success: return GroupStatsResponse( success=True, message=f"群组统计数据已清空: {request.group_id}", data={"group_id": request.group_id, "cleared": True} ) else: raise HTTPException(status_code=400, detail=f"清空群组统计数据失败: {request.group_id}") except HTTPException: raise except Exception as e: logger.error(f"清空群组统计数据失败: group_id={request.group_id}, error={str(e)}") raise HTTPException(status_code=500, detail=f"清空群组统计数据失败: {str(e)}") @router.get("/group-stats", response_model=GroupStatsResponse) async def get_all_groups_overview(): """ 获取所有群组的统计概览 Returns: 所有群组的统计概览 """ try: # 这里可以扩展为获取所有群组的统计信息 # 目前返回基本信息 data = { "message": "群组统计功能已启用", "endpoints": { "get_group_stats": "/api/v1/group-stats/{group_id}", "get_most_active": "/api/v1/group-stats/{group_id}/most-active", "clear_stats": "/api/v1/group-stats/clear" } } return GroupStatsResponse( success=True, message="获取群组统计概览成功", data=data ) except Exception as e: logger.error(f"获取群组统计概览失败: error={str(e)}") raise HTTPException(status_code=500, detail=f"获取群组统计概览失败: {str(e)}")