arxplorer / src /router /summary.py
Subhadeep Mandal
Fixed db bugs
4c719e5
Raw
History Blame Contribute Delete
3.85 kB
from fastapi import APIRouter, Depends, Request
from ..controller import summary as summary_controller
from ..schema.summary import (
SummaryResponse,
SummaryGenerateRequest,
UsabilityResponse,
UsabilityGenerateRequest,
)
from ..lib.auth import get_current_user
from ..lib.api_key_middleware import load_user_api_keys
router = APIRouter()
# Static routes MUST be registered before parametric /{arxiv_id} routes
# to avoid path shadowing (e.g. POST /generate matching /{arxiv_id}).
@router.post("/generate", response_model=SummaryResponse)
async def generate_summary_flexible(
payload: SummaryGenerateRequest,
request: Request,
user_id: int = Depends(get_current_user),
_: int = Depends(load_user_api_keys),
):
"""Generate a summary for a paper using arxiv_id or pdf_url."""
summary = await summary_controller.generate_paper_summary(
user_id=user_id,
arxiv_id=payload.arxiv_id,
pdf_url=payload.pdf_url,
request=request,
)
return SummaryResponse(arxiv_id=payload.arxiv_id or "", summary=summary)
@router.post("/usability/generate", response_model=UsabilityResponse)
async def generate_usability_flexible(
payload: UsabilityGenerateRequest,
request: Request,
user_id: int = Depends(get_current_user),
_: int = Depends(load_user_api_keys),
):
"""Generate usability metrics for a paper using arxiv_id or pdf_url."""
usability_data = await summary_controller.generate_paper_usability(
user_id=user_id,
arxiv_id=payload.arxiv_id,
pdf_url=payload.pdf_url,
request=request,
)
return UsabilityResponse(
arxiv_id=payload.arxiv_id,
pdf_url=payload.pdf_url,
domain_applicability=usability_data.get("domain_applicability", {}),
reproducibility_score=usability_data.get("reproducibility_score", {}),
new_tech_applicability=usability_data.get("new_tech_applicability", {}),
impact_score=usability_data.get("impact_score"),
)
@router.get("/{arxiv_id}")
async def get_summary_and_usability(
arxiv_id: str, user_id: int = Depends(get_current_user)
):
"""Get the summary and usability metrics for a specific paper."""
summary = await summary_controller.get_summary_and_usability(arxiv_id, user_id)
return {
"arxiv_id": arxiv_id,
"summary": summary.get("summary"),
"usability": summary.get("usability"),
}
@router.post("/{arxiv_id}", response_model=SummaryResponse)
async def generate_summary(
arxiv_id: str,
request: Request,
user_id: int = Depends(get_current_user),
_: int = Depends(load_user_api_keys),
):
"""Generate a summary for a specific paper (backward compatibility)."""
summary = await summary_controller.generate_paper_summary(
user_id=user_id, arxiv_id=arxiv_id, request=request
)
return SummaryResponse(arxiv_id=arxiv_id, summary=summary)
@router.post("/{arxiv_id}/usability", response_model=UsabilityResponse)
async def generate_usability(
arxiv_id: str,
request: Request,
user_id: int = Depends(get_current_user),
_: int = Depends(load_user_api_keys),
):
"""Generate usability metrics for a specific paper (backward compatibility)."""
usability_data = await summary_controller.generate_paper_usability(
user_id=user_id, arxiv_id=arxiv_id, request=request
)
return UsabilityResponse(
arxiv_id=arxiv_id,
domain_applicability=usability_data.get("domain_applicability", {}),
reproducibility_score=usability_data.get("reproducibility_score", {}),
new_tech_applicability=usability_data.get("new_tech_applicability", {}),
impact_score=usability_data.get("impact_score"),
)