rrr4 / app /api /endpoints /admin_dashboard.py
minaewrw's picture
Initial backend deployment for Hugging Face Spaces
11757af
from fastapi import APIRouter, HTTPException, Depends
from typing import Dict, Any, List
from ...core.admin_auth import get_current_admin
from ...core.database import db_manager
from ...core.cache import api_cache
import os
import psutil
import time
from datetime import datetime
import logging
router = APIRouter(prefix="/admin/dashboard", tags=["admin-dashboard"])
logger = logging.getLogger("api.admin.dashboard")
@router.get("/stats/overview")
async def get_overview_stats(current_admin: str = Depends(get_current_admin)):
"""
Get general overview statistics for the dashboard.
"""
try:
stats = {
"users": {"total": 0, "active_today": 0, "total_points": 0},
"content": {"comments": 0, "courses": 0},
"system": {"cache_size": 0, "uptime": 0}
}
async with db_manager.get_connection() as db:
# Users Stats
cursor = await db.execute("SELECT COUNT(*), SUM(points) FROM users")
user_res = await cursor.fetchone()
if user_res:
stats["users"]["total"] = user_res[0] or 0
stats["users"]["total_points"] = user_res[1] or 0
# Comments Stats (assuming comments table exists, handle if not)
try:
cursor = await db.execute("SELECT COUNT(*) FROM comments")
comment_res = await cursor.fetchone()
if comment_res:
stats["content"]["comments"] = comment_res[0]
except Exception:
stats["content"]["comments"] = 0 # Table might not exist yet
# Courses Stats (assuming courses table exists)
try:
cursor = await db.execute("SELECT COUNT(*) FROM courses")
course_res = await cursor.fetchone()
if course_res:
stats["content"]["courses"] = course_res[0]
except Exception:
stats["content"]["courses"] = 0
# System Stats
process = psutil.Process(os.getpid())
stats["system"]["uptime"] = int(time.time() - process.create_time())
stats["system"]["cache_keys"] = len(api_cache.cache) if hasattr(api_cache, 'cache') else 0
return {
"success": True,
"data": stats
}
except Exception as e:
logger.error(f"Error fetching dashboard stats: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/users/list")
async def get_users_list(limit: int = 50, offset: int = 0, current_admin: str = Depends(get_current_admin)):
"""Get paginated list of users"""
try:
async with db_manager.get_connection() as db:
cursor = await db.execute(
"SELECT id, points, watch_time_total, is_fan, created_at FROM users ORDER BY points DESC LIMIT ? OFFSET ?",
(limit, offset)
)
users = await cursor.fetchall()
return {
"success": True,
"users": [dict(u) for u in users]
}
except Exception as e:
logger.error(f"Error fetching users: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/system/logs")
async def get_system_logs(lines: int = 20, current_admin: str = Depends(get_current_admin)):
"""Get last N lines of system logs (simulated or real if file exists)"""
# This is a placeholder as we might not have direct file access to logs in this setup
# But we can return some recent events stored in memory if we had them
return {
"success": True,
"logs": ["System logs not fully implemented in file mode yet."]
}