# models/database/vendor_domain.py """ Vendor Domain Model - Maps custom domains to vendors """ from datetime import datetime, timezone from sqlalchemy import (Boolean, Column, DateTime, ForeignKey, Index, Integer, String, UniqueConstraint) from sqlalchemy.orm import relationship from app.core.database import Base from models.database.base import TimestampMixin class VendorDomain(Base, TimestampMixin): """ Maps custom domains to vendors for multi-domain routing. Examples: - customdomain1.com → Vendor 1 - shop.mybusiness.com → Vendor 2 - www.customdomain1.com → Vendor 1 (www is stripped) """ __tablename__ = "vendor_domains" id = Column(Integer, primary_key=True, index=True) vendor_id = Column( Integer, ForeignKey("vendors.id", ondelete="CASCADE"), nullable=False ) # Domain configuration domain = Column(String(255), nullable=False, unique=True, index=True) is_primary = Column(Boolean, default=False, nullable=False) is_active = Column(Boolean, default=True, nullable=False) # SSL/TLS status (for monitoring) ssl_status = Column( String(50), default="pending" ) # pending, active, expired, error ssl_verified_at = Column(DateTime(timezone=True), nullable=True) # DNS verification (to confirm domain ownership) verification_token = Column(String(100), unique=True, nullable=True) is_verified = Column(Boolean, default=False, nullable=False) verified_at = Column(DateTime(timezone=True), nullable=True) # Relationships vendor = relationship("Vendor", back_populates="domains") # Constraints __table_args__ = ( UniqueConstraint("vendor_id", "domain", name="uq_vendor_domain"), Index("idx_domain_active", "domain", "is_active"), Index("idx_vendor_primary", "vendor_id", "is_primary"), ) def __repr__(self): return f"" @property def full_url(self): """Return full URL with https""" return f"https://{self.domain}" @classmethod def normalize_domain(cls, domain: str) -> str: """ Normalize domain for consistent storage. Examples: - https://example.com → example.com - www.example.com → example.com - EXAMPLE.COM → example.com """ # Remove protocol domain = domain.replace("https://", "").replace("http://", "") # Remove trailing slash domain = domain.rstrip("/") # Remove www prefix (optional - depends on your preference) # if domain.startswith("www."): # domain = domain[4:] # Convert to lowercase domain = domain.lower() return domain