geo/backend/app/api/admin.py

108 lines
2.8 KiB
Python

import uuid
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.deps import get_current_user
from app.database import get_db
from app.models.user import User
from app.services.admin import (
get_system_stats,
get_user_detail,
get_users,
toggle_user_active,
update_user_plan,
)
router = APIRouter(prefix="/api/v1/admin", tags=["admin"])
async def get_admin_user(current_user: User = Depends(get_current_user)) -> User:
if not current_user.is_admin:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="需要管理员权限",
)
return current_user
@router.get("/stats")
async def read_system_stats(
db: AsyncSession = Depends(get_db),
admin_user: User = Depends(get_admin_user),
):
return await get_system_stats(db)
@router.get("/users")
async def read_users(
skip: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
search: str | None = Query(None),
db: AsyncSession = Depends(get_db),
admin_user: User = Depends(get_admin_user),
):
return await get_users(db, skip=skip, limit=limit, search=search)
@router.get("/users/{user_id}")
async def read_user_detail(
user_id: uuid.UUID,
db: AsyncSession = Depends(get_db),
admin_user: User = Depends(get_admin_user),
):
detail = await get_user_detail(db, user_id)
if detail is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="用户不存在",
)
return detail
@router.post("/users/{user_id}/toggle-active")
async def toggle_user_active_status(
user_id: uuid.UUID,
db: AsyncSession = Depends(get_db),
admin_user: User = Depends(get_admin_user),
):
result = await toggle_user_active(db, user_id)
if result is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="用户不存在",
)
return result
class UpdatePlanRequest:
plan: str
@router.put("/users/{user_id}/update-plan")
async def modify_user_plan(
user_id: uuid.UUID,
body: dict,
db: AsyncSession = Depends(get_db),
admin_user: User = Depends(get_admin_user),
):
plan = body.get("plan")
if not plan:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="缺少 plan 字段",
)
try:
result = await update_user_plan(db, user_id, plan)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e),
)
if result is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="用户不存在",
)
return result