from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, status from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.dependencies import get_current_admin from app.schemas.admin import AdminAuditRequest, AdminBanRequest from app.services.notify_service import send_audit_result from app.services.admin_service import audit_user, ban_user, get_user_detail, list_users from app.utils.media import sanitize_user_media_payload router = APIRouter() @router.get("") async def get_pending_users( keyword: str | None = Query(default=None), audit_status: int | None = Query(default=None), gender: int | None = Query(default=None), only_pending: bool = Query(default=False), admin_payload: dict = Depends(get_current_admin), session: AsyncSession = Depends(get_db), ) -> dict: _ = admin_payload users = await list_users( session, keyword=keyword, audit_status=audit_status, gender=gender, only_pending=only_pending, ) data = [ sanitize_user_media_payload({ "id": user.id, "nickname": user.nickname, "real_name": user.real_name, "gender": user.gender, "city": user.city, "avatar_url": user.avatar_url, "profile_images": user.profile_images, "audit_status": user.audit_status, "updated_at": user.updated_at.isoformat() if user.updated_at else None, "self_intro": user.self_intro, }) for user in users ] return {"code": 0, "message": "ok", "data": data} @router.put("/{user_id}/audit") async def audit_pending_user( user_id: int, payload: AdminAuditRequest, background_tasks: BackgroundTasks, admin_payload: dict = Depends(get_current_admin), session: AsyncSession = Depends(get_db), ) -> dict: try: user = await audit_user(session, user_id, int(admin_payload["admin_id"]), payload) except ValueError as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc if user is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found") if user.subscribe_audit == 1 and user.openid: background_tasks.add_task( send_audit_result, user.openid, user.audit_status == 2, user.audit_remark or "", ) return { "code": 0, "message": "ok", "data": { "id": user.id, "audit_status": user.audit_status, "audit_remark": user.audit_remark, }, } @router.get("/{user_id}") async def get_user( user_id: int, admin_payload: dict = Depends(get_current_admin), session: AsyncSession = Depends(get_db), ) -> dict: _ = admin_payload user = await get_user_detail(session, user_id) if user is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found") data = sanitize_user_media_payload({ "id": user.id, "nickname": user.nickname, "real_name": user.real_name, "gender": user.gender, "birth_year": user.birth_year, "city": user.city, "height": user.height, "education": user.education, "job_industry": user.job_industry, "job_company": user.job_company, "income_range": user.income_range, "self_intro": user.self_intro, "avatar_url": user.avatar_url, "profile_images": user.profile_images, "audit_status": user.audit_status, "audit_remark": user.audit_remark, "is_active": user.is_active, "ban_reason": user.ban_reason, }) return {"code": 0, "message": "ok", "data": data} @router.put("/{user_id}/ban") async def ban_or_unban_user( user_id: int, payload: AdminBanRequest, admin_payload: dict = Depends(get_current_admin), session: AsyncSession = Depends(get_db), ) -> dict: _ = admin_payload user = await ban_user(session, user_id, payload) if user is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found") return { "code": 0, "message": "ok", "data": { "id": user.id, "is_active": user.is_active, "ban_reason": user.ban_reason, }, }