pounce/backend/app/models/tld_price.py
Yves Gugger 9acb90c067 Initial commit: Pounce - Domain Monitoring System
- FastAPI backend mit Domain-Check, TLD-Pricing, User-Management
- Next.js frontend mit modernem UI
- Sortierbare TLD-Tabelle mit Mini-Charts
- Domain availability monitoring
- Subscription tiers (Starter, Professional, Enterprise)
- Authentication & Authorization
- Scheduler für automatische Domain-Checks
2025-12-08 07:26:57 +01:00

75 lines
2.7 KiB
Python

"""TLD Price History model for tracking domain extension prices over time."""
from datetime import datetime
from sqlalchemy import String, DateTime, Float, Integer, Text
from sqlalchemy.orm import Mapped, mapped_column
from app.database import Base
class TLDPrice(Base):
"""
TLD Price model for tracking domain extension prices.
Stores historical pricing data for different TLDs (e.g., .com, .io, .co)
from various registrars.
"""
__tablename__ = "tld_prices"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
# TLD info
tld: Mapped[str] = mapped_column(String(50), index=True, nullable=False) # e.g., "com", "io", "co"
# Registrar info
registrar: Mapped[str] = mapped_column(String(100), nullable=False) # e.g., "namecheap", "godaddy"
# Pricing (in USD)
registration_price: Mapped[float] = mapped_column(Float, nullable=False) # First year
renewal_price: Mapped[float] = mapped_column(Float, nullable=True) # Renewal
transfer_price: Mapped[float] = mapped_column(Float, nullable=True) # Transfer
# Currency
currency: Mapped[str] = mapped_column(String(3), default="USD")
# Timestamp
recorded_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, index=True)
# Additional info
promo_price: Mapped[float | None] = mapped_column(Float, nullable=True) # Promotional price
notes: Mapped[str | None] = mapped_column(Text, nullable=True)
def __repr__(self) -> str:
return f"<TLDPrice .{self.tld} @ {self.registrar}: ${self.registration_price}>"
class TLDInfo(Base):
"""
General TLD information and metadata.
"""
__tablename__ = "tld_info"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
tld: Mapped[str] = mapped_column(String(50), unique=True, index=True, nullable=False)
# Metadata
type: Mapped[str] = mapped_column(String(50), nullable=True) # generic, country-code, sponsored
description: Mapped[str | None] = mapped_column(Text, nullable=True)
registry: Mapped[str | None] = mapped_column(String(200), nullable=True)
# Restrictions
is_restricted: Mapped[bool] = mapped_column(default=False)
restriction_notes: Mapped[str | None] = mapped_column(Text, nullable=True)
# Popularity (for sorting)
popularity_rank: Mapped[int | None] = mapped_column(Integer, nullable=True)
# Timestamps
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self) -> str:
return f"<TLDInfo .{self.tld}>"