fix: Ensure 100% price consistency across all TLD pages
ROOT CAUSE: - Overview API prioritized database data (only Porkbun prices) - Compare API prioritized static data (5+ registrars) - This caused price mismatches between Overview table and Detail page SOLUTION: - Changed Overview API to prioritize static data for TLDs with rich multi-registrar pricing (like Compare API does) - Database data now used only for TLDs NOT in static data - This ensures all APIs return identical prices for same TLDs VERIFICATION: - .com: Overview=$10.75, Compare=$10.75 ✓ - .io: Overview=$32.33, Compare=$32.33 ✓ - .ai: Overview=$71.63, Compare=$71.63 ✓ - .xyz: Overview=$6.86, Compare=$6.86 ✓ DATA FLOW (now consistent): 1. Static TLDs (18): Use rich multi-registrar data 2. DB-only TLDs (869): Use Porkbun scraped data 3. Total: 887 TLDs with consistent pricing
This commit is contained in:
@ -346,40 +346,25 @@ async def get_tld_overview(
|
|||||||
):
|
):
|
||||||
"""Get overview of TLDs with current pricing, pagination, and search.
|
"""Get overview of TLDs with current pricing, pagination, and search.
|
||||||
|
|
||||||
|
Data source priority:
|
||||||
|
- For TLDs with rich static data (multiple registrars): Use static data for consistency
|
||||||
|
- For TLDs only in database: Use database data
|
||||||
|
- This ensures Overview and Compare/Detail pages show identical prices
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
limit: Number of results per page (default 25)
|
limit: Number of results per page (default 25)
|
||||||
offset: Skip N results for pagination
|
offset: Skip N results for pagination
|
||||||
search: Filter TLDs by name (e.g., "com", "io")
|
search: Filter TLDs by name (e.g., "com", "io")
|
||||||
sort_by: Sort order - popularity (default), price_asc, price_desc, name
|
sort_by: Sort order - popularity (default), price_asc, price_desc, name
|
||||||
source: Data source - "auto" (DB first, fallback to static), "db" (only DB), "static" (only static)
|
source: Data source - "auto" (best available), "db" (only DB), "static" (only static)
|
||||||
"""
|
"""
|
||||||
tld_list = []
|
tld_list = []
|
||||||
data_source = "static"
|
tld_seen = set()
|
||||||
|
data_source = "combined"
|
||||||
|
|
||||||
# Try database first if auto or db
|
# FIRST: Add all static data TLDs (these have rich multi-registrar data)
|
||||||
if source in ["auto", "db"]:
|
# This ensures consistency with /compare endpoint which also uses static data first
|
||||||
db_count = await get_db_price_count(db)
|
if source in ["auto", "static"]:
|
||||||
if db_count > 0:
|
|
||||||
db_prices = await get_db_prices(db)
|
|
||||||
data_source = "database"
|
|
||||||
|
|
||||||
for tld, data in db_prices.items():
|
|
||||||
prices = data["prices"]
|
|
||||||
tld_list.append({
|
|
||||||
"tld": tld,
|
|
||||||
"type": guess_tld_type(tld),
|
|
||||||
"description": TLD_DATA.get(tld, {}).get("description", f".{tld} domain"),
|
|
||||||
"avg_registration_price": round(sum(prices) / len(prices), 2),
|
|
||||||
"min_registration_price": min(prices),
|
|
||||||
"max_registration_price": max(prices),
|
|
||||||
"registrar_count": len(data["registrars"]),
|
|
||||||
"trend": TLD_DATA.get(tld, {}).get("trend", "stable"),
|
|
||||||
"popularity_rank": TOP_TLDS_BY_POPULARITY.index(tld) if tld in TOP_TLDS_BY_POPULARITY else 999,
|
|
||||||
})
|
|
||||||
|
|
||||||
# Use static data as fallback or if requested
|
|
||||||
if not tld_list and source in ["auto", "static"]:
|
|
||||||
data_source = "static"
|
|
||||||
for tld, data in TLD_DATA.items():
|
for tld, data in TLD_DATA.items():
|
||||||
tld_list.append({
|
tld_list.append({
|
||||||
"tld": tld,
|
"tld": tld,
|
||||||
@ -392,6 +377,38 @@ async def get_tld_overview(
|
|||||||
"trend": data["trend"],
|
"trend": data["trend"],
|
||||||
"popularity_rank": TOP_TLDS_BY_POPULARITY.index(tld) if tld in TOP_TLDS_BY_POPULARITY else 999,
|
"popularity_rank": TOP_TLDS_BY_POPULARITY.index(tld) if tld in TOP_TLDS_BY_POPULARITY else 999,
|
||||||
})
|
})
|
||||||
|
tld_seen.add(tld)
|
||||||
|
|
||||||
|
# SECOND: Add TLDs from database that are NOT in static data
|
||||||
|
# This adds the 800+ TLDs scraped from Porkbun
|
||||||
|
if source in ["auto", "db"]:
|
||||||
|
db_count = await get_db_price_count(db)
|
||||||
|
if db_count > 0:
|
||||||
|
db_prices = await get_db_prices(db)
|
||||||
|
|
||||||
|
for tld, data in db_prices.items():
|
||||||
|
if tld not in tld_seen: # Only add if not already from static
|
||||||
|
prices = data["prices"]
|
||||||
|
tld_list.append({
|
||||||
|
"tld": tld,
|
||||||
|
"type": guess_tld_type(tld),
|
||||||
|
"description": f".{tld} domain extension",
|
||||||
|
"avg_registration_price": round(sum(prices) / len(prices), 2),
|
||||||
|
"min_registration_price": min(prices),
|
||||||
|
"max_registration_price": max(prices),
|
||||||
|
"registrar_count": len(data["registrars"]),
|
||||||
|
"trend": "stable",
|
||||||
|
"popularity_rank": TOP_TLDS_BY_POPULARITY.index(tld) if tld in TOP_TLDS_BY_POPULARITY else 999,
|
||||||
|
})
|
||||||
|
tld_seen.add(tld)
|
||||||
|
|
||||||
|
# Determine source label
|
||||||
|
if source == "static":
|
||||||
|
data_source = "static"
|
||||||
|
elif source == "db":
|
||||||
|
data_source = "database"
|
||||||
|
else:
|
||||||
|
data_source = "combined"
|
||||||
|
|
||||||
# Apply search filter
|
# Apply search filter
|
||||||
if search:
|
if search:
|
||||||
|
|||||||
Reference in New Issue
Block a user