feat: restructure market app with per-market URL scoping
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 41s

- URL structure changes from /<route> to /<market_slug>/<route>
- Root / shows markets listing page
- app.py: url_value_preprocessor, url_defaults, hydrate_market (events app pattern)
- Browse queries (db_nav, db_products_nocounts, db_products_counts) accept market_id
- _productInfo reads g.market.id to scope all queries
- save_nav accepts market_id, sets on new NavTop rows
- API save_nav passes g.market.id
- Scraper default URLs point to /suma-market/ on port 8001

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-10 18:08:48 +00:00
parent 6a266bd94d
commit 9b2687b039
13 changed files with 224 additions and 48 deletions

View File

@@ -11,7 +11,7 @@ async def capture_listing(
total_pages: int
):
sync_url = os.getenv("CAPTURE_LISTING_URL", "http://localhost:8000/market/api/products/listing/")
sync_url = os.getenv("CAPTURE_LISTING_URL", "http://localhost:8001/suma-market/api/products/listing/")
async with httpx.AsyncClient(timeout=httpx.Timeout(20.0, connect=10.0)) as client:
_d = {

View File

@@ -8,7 +8,7 @@ from typing import Dict
async def save_nav(
nav: Dict,
):
sync_url = os.getenv("SAVE_NAV_URL", "http://localhost:8000/market/api/products/nav/")
sync_url = os.getenv("SAVE_NAV_URL", "http://localhost:8001/suma-market/api/products/nav/")
async with httpx.AsyncClient(timeout=httpx.Timeout(20.0, connect=10.0)) as client:
resp = await client.post(sync_url, json=nav)

View File

@@ -21,7 +21,7 @@ async def upsert_product(
d["slug"] = slug
# Where to post; override via env if needed
sync_url = os.getenv("PRODUCT_SYNC_URL", "http://localhost:8000/market/api/products/sync/")
sync_url = os.getenv("PRODUCT_SYNC_URL", "http://localhost:8001/suma-market/api/products/sync/")

View File

@@ -19,7 +19,7 @@ async def save_nav(nav: Dict) -> None:
await _save_nav(session, nav)
await session.commit()
async def _save_nav(session, nav: Dict) -> None:
async def _save_nav(session, nav: Dict, market_id=None) -> None:
print('===================SAVE NAV========================')
print(nav)
now = datetime.utcnow()
@@ -79,8 +79,10 @@ async def _save_nav(session, nav: Dict) -> None:
if top:
top.label = label
top.deleted_at = None
if market_id is not None and top.market_id is None:
top.market_id = market_id
else:
top = NavTop(label=label, slug=top_slug)
top = NavTop(label=label, slug=top_slug, market_id=market_id)
session.add(top)
await session.flush()