import uuid from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy import select 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.models.brand import Brand from app.schemas.citation import ( CitationListResponse, CitationStatsResponse, ) from app.services.citation.citation import ( get_citation_stats, get_citations, ) router = APIRouter() def _to_uuid(value: str | uuid.UUID) -> uuid.UUID: if isinstance(value, uuid.UUID): return value return uuid.UUID(str(value)) @router.get("/", response_model=CitationListResponse) async def list_citations( query_id: uuid.UUID | None = Query(None), platform: str | None = Query(None), start_date: datetime | None = Query(None), end_date: datetime | None = Query(None), skip: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): items, total = await get_citations( db, _to_uuid(current_user.id), query_id=query_id, platform=platform, start_date=start_date, end_date=end_date, skip=skip, limit=limit, ) return {"items": items, "total": total} @router.get("/stats", response_model=CitationStatsResponse) async def citation_stats( brand_id: uuid.UUID | None = Query(None), query_id: uuid.UUID | None = Query(None), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): # If brand_id is provided, verify the brand exists and belongs to user if brand_id is not None: brand_stmt = select(Brand).where( Brand.id == brand_id, Brand.user_id == _to_uuid(current_user.id), ) brand_result = await db.execute(brand_stmt) brand = brand_result.scalar_one_or_none() if brand is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="品牌不存在", ) stats = await get_citation_stats( db, _to_uuid(current_user.id), query_id=query_id, brand_id=brand_id ) return stats