39 lines
1.0 KiB
Python
39 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from app.extractor import extract
|
|
from app.schemas import ParseRequest, ParseResponse
|
|
|
|
logger = logging.getLogger("shagua.parse")
|
|
|
|
router = APIRouter(prefix="/api/v1")
|
|
|
|
|
|
@router.post("/parse", response_model=ParseResponse)
|
|
def parse(req: ParseRequest) -> ParseResponse:
|
|
logger.info(
|
|
"parse request package=%s tree=%s clusters=%d",
|
|
req.package_name,
|
|
bool(req.tree),
|
|
len(req.clusters),
|
|
)
|
|
result = extract(req.package_name, req.tree, req.clusters)
|
|
|
|
if not result.get("success"):
|
|
logger.info("parse failed: reason=%s raw=%s", result.get("reason"), result.get("raw"))
|
|
raise HTTPException(
|
|
status_code=422,
|
|
detail=result.get("reason", "extract_failed"),
|
|
)
|
|
|
|
return ParseResponse(
|
|
title=result["title"],
|
|
price=result["price"],
|
|
source_app=result["source_app"],
|
|
cluster_id=result.get("cluster_id"),
|
|
typical_price=result["typical_price"],
|
|
)
|