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
Adds HUNT (Sniper/Trend/Forge), CFO dashboard (burn rate + kill list), and a plugin-based Analyze side panel with caching and SSRF hardening.
94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
"""
|
|
TLD pricing snapshot (open-data via internal DB).
|
|
|
|
Uses our own collected TLD price history (no external API calls here).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import func, select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.tld_price import TLDPrice
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TldPriceSnapshot:
|
|
tld: str
|
|
min_register_usd: Optional[float]
|
|
min_register_registrar: Optional[str]
|
|
min_renew_usd: Optional[float]
|
|
min_renew_registrar: Optional[str]
|
|
min_transfer_usd: Optional[float]
|
|
min_transfer_registrar: Optional[str]
|
|
latest_recorded_at: Optional[datetime]
|
|
|
|
|
|
async def get_tld_price_snapshot(db: AsyncSession, tld: str) -> TldPriceSnapshot:
|
|
tld = (tld or "").lower().lstrip(".")
|
|
|
|
# Latest record per registrar for this TLD, then take min renew.
|
|
subq = (
|
|
select(
|
|
TLDPrice.registrar,
|
|
func.max(TLDPrice.recorded_at).label("max_date"),
|
|
)
|
|
.where(TLDPrice.tld == tld)
|
|
.group_by(TLDPrice.registrar)
|
|
.subquery()
|
|
)
|
|
|
|
rows = (
|
|
await db.execute(
|
|
select(TLDPrice)
|
|
.join(
|
|
subq,
|
|
(TLDPrice.registrar == subq.c.registrar)
|
|
& (TLDPrice.recorded_at == subq.c.max_date),
|
|
)
|
|
.where(TLDPrice.tld == tld)
|
|
)
|
|
).scalars().all()
|
|
|
|
if not rows:
|
|
return TldPriceSnapshot(
|
|
tld=tld,
|
|
min_register_usd=None,
|
|
min_register_registrar=None,
|
|
min_renew_usd=None,
|
|
min_renew_registrar=None,
|
|
min_transfer_usd=None,
|
|
min_transfer_registrar=None,
|
|
latest_recorded_at=None,
|
|
)
|
|
|
|
def _reg_price(r) -> float:
|
|
return float(r.registration_price or 1e12)
|
|
|
|
def _renew_price(r) -> float:
|
|
return float(r.renewal_price or r.registration_price or 1e12)
|
|
|
|
def _transfer_price(r) -> float:
|
|
return float(r.transfer_price or r.registration_price or 1e12)
|
|
|
|
best_reg = min(rows, key=_reg_price)
|
|
best_renew = min(rows, key=_renew_price)
|
|
best_transfer = min(rows, key=_transfer_price)
|
|
latest = max((r.recorded_at for r in rows if r.recorded_at), default=None)
|
|
|
|
return TldPriceSnapshot(
|
|
tld=tld,
|
|
min_register_usd=float(best_reg.registration_price),
|
|
min_register_registrar=str(best_reg.registrar),
|
|
min_renew_usd=float(best_renew.renewal_price or best_renew.registration_price),
|
|
min_renew_registrar=str(best_renew.registrar),
|
|
min_transfer_usd=float(best_transfer.transfer_price or best_transfer.registration_price),
|
|
min_transfer_registrar=str(best_transfer.registrar),
|
|
latest_recorded_at=latest,
|
|
)
|
|
|