|
11 | 11 | from slowapi.errors import RateLimitExceeded |
12 | 12 | from slowapi.middleware import SlowAPIMiddleware |
13 | 13 | from rate_limiter import limiter |
| 14 | +from fastapi_cache import FastAPICache |
| 15 | +from fastapi_cache.backends.inmemory import InMemoryBackend |
| 16 | +from fastapi_cache.decorator import cache |
14 | 17 | from chat_router import router as chat_router |
15 | 18 |
|
16 | 19 |
|
@@ -95,6 +98,7 @@ async def lifespan(app: FastAPI): |
95 | 98 | f"WARNING: Model files not found at {MODEL_DIR}. " |
96 | 99 | "Scan endpoints will return 503 until models are present." |
97 | 100 | ) |
| 101 | + FastAPICache.init(InMemoryBackend(), prefix="freshscanai-cache") |
98 | 102 | yield |
99 | 103 |
|
100 | 104 |
|
@@ -771,31 +775,35 @@ async def get_vendor_leaderboard(): |
771 | 775 | # ── MAP ─────────────────────────────────────────────────────────────────────── |
772 | 776 |
|
773 | 777 |
|
| 778 | +@cache(expire=300, namespace="markets") |
| 779 | +async def _get_markets_cached() -> dict: |
| 780 | + resp = ( |
| 781 | + _db() |
| 782 | + .table("vendors") |
| 783 | + .select("id, name, avg_freshness_score, trust_score, lat, lng, vendor_count") |
| 784 | + .execute() |
| 785 | + ) |
| 786 | + markets = [ |
| 787 | + { |
| 788 | + "id": i + 1, |
| 789 | + "name": v["name"], |
| 790 | + "score": int(v.get("avg_freshness_score") or v.get("trust_score") or 0), |
| 791 | + "lat": float(v.get("lat") or 0), |
| 792 | + "lng": float(v.get("lng") or 0), |
| 793 | + "vendors": int(v.get("vendor_count") or 1), |
| 794 | + } |
| 795 | + for i, v in enumerate(resp.data or []) |
| 796 | + if v.get("lat") and v.get("lng") |
| 797 | + ] |
| 798 | + return {"success": True, "markets": markets} |
| 799 | + |
| 800 | + |
774 | 801 | @app.get("/api/v1/maps/markets") |
775 | 802 | @limiter.limit("20/minute") |
776 | 803 | async def get_markets(request: Request): |
777 | 804 | try: |
778 | | - resp = ( |
779 | | - _db() |
780 | | - .table("vendors") |
781 | | - .select("id, name, avg_freshness_score, trust_score, lat, lng, vendor_count") |
782 | | - .execute() |
783 | | - ) |
784 | | - markets = [ |
785 | | - { |
786 | | - "id": i + 1, |
787 | | - "name": v["name"], |
788 | | - "score": int(v.get("avg_freshness_score") or v.get("trust_score") or 0), |
789 | | - "lat": float(v.get("lat") or 0), |
790 | | - "lng": float(v.get("lng") or 0), |
791 | | - "vendors": int(v.get("vendor_count") or 1), |
792 | | - } |
793 | | - for i, v in enumerate(resp.data or []) |
794 | | - if v.get("lat") and v.get("lng") |
795 | | - ] |
796 | | - return {"success": True, "markets": markets} |
| 805 | + return await _get_markets_cached() |
797 | 806 | except Exception: |
798 | | - # Migration not applied yet — return empty markets, map still renders |
799 | 807 | return { |
800 | 808 | "success": True, |
801 | 809 | "markets": [], |
|
0 commit comments