geo/backend/app/api/citations.py

79 lines
2.3 KiB
Python

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