from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.services.admin import AdminService from app.api.v1.deps import get_current_user router = APIRouter() async def require_admin(current_user: dict = Depends(get_current_user)) -> dict: if current_user.get("role") != "admin": raise HTTPException(status_code=403, detail="Admin access required") return current_user @router.get("/dashboard") async def get_dashboard( _: dict = Depends(require_admin), db: AsyncSession = Depends(get_db), ): service = AdminService(db) return await service.get_dashboard() @router.get("/users") async def list_users( page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100), _: dict = Depends(require_admin), db: AsyncSession = Depends(get_db), ): service = AdminService(db) return await service.list_users(page, size) @router.patch("/users/{target_user_id}/tier") async def update_user_tier( target_user_id: str, data: dict, _: dict = Depends(require_admin), db: AsyncSession = Depends(get_db), ): service = AdminService(db) tier = data.get("tier") if tier not in ("free", "pro", "enterprise"): raise HTTPException(status_code=400, detail="Invalid tier") success = await service.update_user_tier(target_user_id, tier) if not success: raise HTTPException(status_code=404, detail="User not found") return {"message": f"User tier updated to {tier}"} @router.post("/users/{target_user_id}/toggle-active") async def toggle_user_active( target_user_id: str, _: dict = Depends(require_admin), db: AsyncSession = Depends(get_db), ): service = AdminService(db) success = await service.toggle_user_active(target_user_id) if not success: raise HTTPException(status_code=404, detail="User not found") return {"message": "User active status toggled"} @router.get("/health") async def system_health( db: AsyncSession = Depends(get_db), ): service = AdminService(db) return await service.get_system_health()