49 lines
2.0 KiB
Python
49 lines
2.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select
|
|
import json
|
|
from app.database import get_db
|
|
from app.models.user import User
|
|
from app.models.scan import Scan
|
|
from app.models.product import Product
|
|
from app.utils.security import get_current_user
|
|
from app.services.achievements import check_achievements
|
|
|
|
router = APIRouter(prefix="/api", tags=["compare"])
|
|
|
|
@router.post("/compare")
|
|
async def compare_products(data: dict, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
|
|
scan_ids = data.get("scan_ids", [])
|
|
if len(scan_ids) < 2 or len(scan_ids) > 4:
|
|
raise HTTPException(status_code=400, detail="Selecione entre 2 e 4 produtos")
|
|
|
|
results = []
|
|
for sid in scan_ids:
|
|
res = await db.execute(select(Scan).where(Scan.id == sid, Scan.user_id == user.id))
|
|
scan = res.scalar_one_or_none()
|
|
if not scan:
|
|
raise HTTPException(status_code=404, detail=f"Scan {sid} não encontrado")
|
|
|
|
analysis = json.loads(scan.analysis_json or '{}')
|
|
prod_res = await db.execute(select(Product).where(Product.barcode == scan.barcode))
|
|
product = prod_res.scalar_one_or_none()
|
|
|
|
results.append({
|
|
"scan_id": scan.id,
|
|
"product_name": scan.product_name,
|
|
"brand": scan.brand,
|
|
"score": scan.score,
|
|
"image_url": product.image_url if product else None,
|
|
"nutri_score": product.nutri_score if product else None,
|
|
"nova_group": product.nova_group if product else None,
|
|
"positives": analysis.get("positives", []),
|
|
"negatives": analysis.get("negatives", []),
|
|
"nutrition": analysis.get("nutrition", {}),
|
|
"nutrition_verdict": analysis.get("nutrition_verdict", ""),
|
|
})
|
|
|
|
# Check comparison achievement
|
|
await check_achievements(user.id, db, action="compare")
|
|
|
|
return {"products": results}
|