add caching, add to stats

This commit is contained in:
C committed 2026-01-05 16:01:36 -08:00
1 parent ab3297acfb
commit dfd2c2f07d
5 files changed
+62 -6

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@ BRICKSET_API_KEY = "your_brickset_api_key"
SQUARE_ENV = "sandbox" # or "production" SQUARE_ENV = "sandbox" # or "production"
# Public webhook URL that Square will POST events to # Public webhook URL that Square will POST events to
SQUARE_WEBHOOK_URL = "https://yourdomain.com/hook" SQUARE_WEBHOOK_URL = "https://yourdomain.com/webhook"
# Sandbox credentials - test environment (fake data, safe for development) # Sandbox credentials - test environment (fake data, safe for development)
SANDBOX_SQUARE_APP_ID = "your_sandbox_app_id" SANDBOX_SQUARE_APP_ID = "your_sandbox_app_id"
+1
View File
@@ -21,6 +21,7 @@ dependencies = [
"fastapi>=0.128.0", "fastapi>=0.128.0",
"uvicorn>=0.40.0", "uvicorn>=0.40.0",
"gunicorn>=23.0.0", "gunicorn>=23.0.0",
"async-lru>=2.0.4",
] ]
[build-system] [build-system]
+3 -1
View File
@@ -11,6 +11,7 @@ import math
import dotenv import dotenv
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
from datetime import datetime, timedelta from datetime import datetime, timedelta
from async_lru import alru_cache
from . import throttler from . import throttler
Throttler = throttler.GlobalThrottler Throttler = throttler.GlobalThrottler
@@ -155,9 +156,10 @@ class AsyncBricksetAPI:
self.logger.info("Successfully authenticated with Brickset API") self.logger.info("Successfully authenticated with Brickset API")
return result return result
@alru_cache(maxsize=1000, ttl=604800) # Cache 1000 sets, 7 days TTL
async def get_set(self, set_number: int) -> Dict[str, Any]: async def get_set(self, set_number: int) -> Dict[str, Any]:
""" """
Fetch LEGO set information asynchronously Fetch LEGO set information asynchronously (cached for 7 days)
Args: Args:
set_number (str): LEGO set number set_number (str): LEGO set number
+54 -3
View File
@@ -7,6 +7,7 @@ import json
from typing import Dict, Any from typing import Dict, Any
from square import AsyncSquare from square import AsyncSquare
from . import get_sq_env from . import get_sq_env
from . import abricksetapi
# Initialize Square client # Initialize Square client
client = AsyncSquare(token=get_sq_env.SQUARE_TOKEN, environment=get_sq_env.environment) client = AsyncSquare(token=get_sq_env.SQUARE_TOKEN, environment=get_sq_env.environment)
@@ -101,12 +102,62 @@ async def get_daily_stats() -> Dict[str, Any]:
} }
async def get_total_items() -> int: async def get_brickset_cache_stats() -> Dict[str, Any]:
""" """
Count total items in LEGO category. Get Brickset API cache statistics.
Returns: Returns:
int: Total number of items dict: {
"cache_enabled": bool,
"cache_hits": int,
"cache_misses": int,
"cache_size": int,
"cache_maxsize": int,
"hit_rate": float (0-100%)
}
"""
# Create a temporary client instance to access cache info
temp_client = abricksetapi.AsyncBricksetAPI()
# Check if get_set has cache_info (it should with @alru_cache)
if hasattr(temp_client.get_set, "cache_info"):
info = await temp_client.get_set.cache_info()
hits = info.hits
misses = info.misses
total = hits + misses
hit_rate = (hits / total * 100) if total > 0 else 0.0
return {
"cache_enabled": True,
"cache_hits": hits,
"cache_misses": misses,
"cache_size": info.currsize,
"cache_maxsize": info.maxsize,
"hit_rate": round(hit_rate, 2),
}
else:
return {
"cache_enabled": False,
"cache_hits": 0,
"cache_misses": 0,
"cache_size": 0,
"cache_maxsize": 0,
"hit_rate": 0.0,
}
async def get_daily_stats() -> Dict[str, Any]:
"""
Gather all metrics for daily_stats table in a single pass.
Returns:
dict: {
"total_items": int,
"enriched_items": int,
"missing_upcs": int,
"missing_images": int,
"total_catalog_value": float
}
""" """
result = await client.catalog.search( result = await client.catalog.search(
object_types=["ITEM"], object_types=["ITEM"],
+3 -1
View File
@@ -67,10 +67,11 @@ async def get_stats():
""" """
Get daily statistics for LEGO inventory. Get daily statistics for LEGO inventory.
Returns metrics about enrichment progress, missing data, and catalog value. Returns metrics about enrichment progress, missing data, catalog value, and cache stats.
""" """
try: try:
daily_stats = await stats.get_daily_stats() daily_stats = await stats.get_daily_stats()
cache_stats = await stats.get_brickset_cache_stats()
# Calculate completion percentage # Calculate completion percentage
if daily_stats["total_items"] > 0: if daily_stats["total_items"] > 0:
@@ -84,6 +85,7 @@ async def get_stats():
"status": "success", "status": "success",
"stats": daily_stats, "stats": daily_stats,
"completion_rate": round(completion_rate, 1), "completion_rate": round(completion_rate, 1),
"brickset_cache": cache_stats,
} }
except Exception as e: except Exception as e:
return JSONResponse( return JSONResponse(