Yves Gugger 202e615e2b
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
fix: TLD Matrix shows own domain correctly as taken + Portfolio table responsive
1. TLD Matrix fix:
   - Pass original_is_taken flag to run_tld_matrix()
   - If main domain check shows taken, force same TLD to show as taken
   - Fixes incorrect "available" display for owned domains

2. Portfolio table:
   - Use minmax() for flexible column widths
   - Smaller gaps and padding for compact layout
   - Smaller action buttons (w-8 h-8)
   - Shorter column labels (Bought, Exp.)
2025-12-18 14:14:37 +01:00

95 lines
2.8 KiB
Python

"""
TLD Matrix analyzer (open-data).
We check availability for the same SLD across a small, curated TLD set.
This is intentionally small to keep the UX fast.
"""
from __future__ import annotations
import asyncio
from dataclasses import dataclass
from app.services.domain_checker import domain_checker
DEFAULT_TLDS = ["com", "net", "org", "io", "ai", "co", "ch"]
@dataclass(frozen=True)
class TldMatrixRow:
tld: str
domain: str
is_available: bool | None
status: str # available|taken|unknown
method: str
error: str | None = None
async def _check_one(domain: str) -> TldMatrixRow:
try:
res = await domain_checker.check_domain(domain, quick=True)
return TldMatrixRow(
tld=domain.split(".")[-1],
domain=domain,
is_available=bool(res.is_available),
status="available" if res.is_available else "taken",
method=str(res.check_method or "dns"),
error=res.error_message,
)
except Exception as e: # noqa: BLE001
return TldMatrixRow(
tld=domain.split(".")[-1],
domain=domain,
is_available=None,
status="unknown",
method="error",
error=str(e),
)
async def run_tld_matrix(domain: str, tlds: list[str] | None = None, original_is_taken: bool = False) -> list[TldMatrixRow]:
"""
Check availability for the same SLD across multiple TLDs.
Args:
domain: The full domain being analyzed (e.g., "akaya.ch")
tlds: List of TLDs to check (defaults to DEFAULT_TLDS)
original_is_taken: If True, force the original domain's TLD to show as taken
"""
parts = (domain or "").lower().strip().split(".")
sld = parts[0] if parts else ""
original_tld = parts[-1] if len(parts) > 1 else ""
tlds = [t.lower().lstrip(".") for t in (tlds or DEFAULT_TLDS)]
# Avoid repeated checks
seen = set()
candidates: list[str] = []
for t in tlds:
d = f"{sld}.{t}"
if d not in seen:
candidates.append(d)
seen.add(d)
rows = await asyncio.gather(*[_check_one(d) for d in candidates])
result = list(rows)
# If the original domain is known to be taken, ensure its TLD shows as taken
# This fixes cases where DNS-based quick checks incorrectly show "available"
# for domains that are registered but have no DNS records
if original_is_taken and original_tld:
result = [
TldMatrixRow(
tld=r.tld,
domain=r.domain,
is_available=False,
status="taken",
method=r.method,
error=r.error,
) if r.tld == original_tld else r
for r in result
]
return result