Files
aletheia/backend/app/routers/compare.py

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}