108 lines
2.8 KiB
Python
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.base import PaginationParams
|
|
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(
|
|
pagination: PaginationParams = Depends(PaginationParams),
|
|
search: str | None = Query(None),
|
|
db: AsyncSession = Depends(get_db),
|
|
admin_user: User = Depends(get_admin_user),
|
|
):
|
|
return await get_users(db, skip=pagination.offset, limit=pagination.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
|