Files
gomag-vending/api/app/services/gomag_client.py
Claude Agent 1d59f1a484 refactor(price): remove price comparison UI and catalog sync
GoMag vs ROA price comparison generated too many false positives
(kits, volume discounts, special prices). Removes comparison columns,
dots, badges, catalog sync endpoints, and ~950 lines of dead code.
Keeps WRITE path (sync_prices_from_order) for kit pricing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 20:30:34 +00:00

106 lines
3.4 KiB
Python

"""GoMag API client - downloads orders and saves them as JSON files."""
import asyncio
import json
import logging
from datetime import datetime, timedelta
from pathlib import Path
from typing import Callable
import httpx
from ..config import settings
logger = logging.getLogger(__name__)
async def download_orders(
json_dir: str,
days_back: int = None,
api_key: str = None,
api_shop: str = None,
limit: int = None,
log_fn: Callable[[str], None] = None,
) -> dict:
"""Download orders from GoMag API and save as JSON files.
Returns dict with keys: pages, total, files (list of saved file paths).
If API keys are not configured, returns immediately with empty result.
Optional api_key, api_shop, limit override config.settings values.
"""
def _log(msg: str):
logger.info(msg)
if log_fn:
log_fn(msg)
effective_key = api_key or settings.GOMAG_API_KEY
effective_shop = api_shop or settings.GOMAG_API_SHOP
effective_limit = limit or settings.GOMAG_LIMIT
if not effective_key or not effective_shop:
_log("GoMag API keys neconfigurați, skip download")
return {"pages": 0, "total": 0, "files": []}
if days_back is None:
days_back = settings.GOMAG_ORDER_DAYS_BACK
start_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
out_dir = Path(json_dir)
out_dir.mkdir(parents=True, exist_ok=True)
# Clean old JSON files before downloading new ones
old_files = list(out_dir.glob("gomag_orders*.json"))
if old_files:
for f in old_files:
f.unlink()
_log(f"Șterse {len(old_files)} fișiere JSON vechi")
headers = {
"Apikey": effective_key,
"ApiShop": effective_shop,
"User-Agent": "Mozilla/5.0",
"Content-Type": "application/json",
}
saved_files = []
total_orders = 0
total_pages = 1
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
async with httpx.AsyncClient(timeout=30) as client:
page = 1
while page <= total_pages:
params = {
"startDate": start_date,
"page": page,
"limit": effective_limit,
}
try:
response = await client.get(settings.GOMAG_API_URL, headers=headers, params=params)
response.raise_for_status()
data = response.json()
except httpx.HTTPError as e:
_log(f"GoMag API eroare pagina {page}: {e}")
break
except Exception as e:
_log(f"GoMag eroare neașteptată pagina {page}: {e}")
break
# Update totals from first page response
if page == 1:
total_orders = int(data.get("total", 0))
total_pages = int(data.get("pages", 1))
_log(f"GoMag: {total_orders} comenzi în {total_pages} pagini (startDate={start_date})")
filename = out_dir / f"gomag_orders_page{page}_{timestamp}.json"
filename.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
saved_files.append(str(filename))
_log(f"GoMag: pagina {page}/{total_pages} salvată → {filename.name}")
page += 1
if page <= total_pages:
await asyncio.sleep(1)
return {"pages": total_pages, "total": total_orders, "files": saved_files}