75 lines
2.1 KiB
Python
75 lines
2.1 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()
|
|
|
|
|
|
@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,
|
|
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 == 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, current_user.id, query_id=query_id, brand_id=brand_id
|
|
)
|
|
return stats
|
|
|