from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.dependencies import get_admin_user, get_db from app.models.contact_request import ContactRequest from app.models.user import User from app.schemas.contact import ContactRequestListOut, ContactRequestOut router = APIRouter(prefix="/admin/contact-requests", tags=["admin-contact-requests"]) @router.get("", response_model=ContactRequestListOut) async def list_contact_requests( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=200), is_handled: bool | None = Query(None), admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): query = select(ContactRequest) count_query = select(func.count(ContactRequest.id)) if is_handled is not None: query = query.where(ContactRequest.is_handled == is_handled) count_query = count_query.where(ContactRequest.is_handled == is_handled) query = query.order_by(ContactRequest.created_at.desc()) offset = (page - 1) * page_size result = await db.execute(query.offset(offset).limit(page_size)) items = result.scalars().all() total = (await db.execute(count_query)).scalar_one() return {"items": items, "total": total} @router.get("/{request_id}", response_model=ContactRequestOut) async def get_contact_request( request_id: str, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id)) item = result.scalar_one_or_none() if not item: raise HTTPException(status_code=404, detail="记录不存在") return item @router.put("/{request_id}/handle") async def mark_contact_handled( request_id: str, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id)) item = result.scalar_one_or_none() if not item: raise HTTPException(status_code=404, detail="记录不存在") item.is_handled = True await db.commit() await db.refresh(item) return {"message": "已标记为处理"} @router.delete("/{request_id}") async def delete_contact_request( request_id: str, admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id)) item = result.scalar_one_or_none() if not item: raise HTTPException(status_code=404, detail="记录不存在") await db.delete(item) await db.commit() return {"message": "删除成功"}