from datetime import datetime, timezone from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON from sqlalchemy.orm import relationship from app.db.base import Base class VisitorLog(Base): __tablename__ = "visitor_logs" id = Column(Integer, primary_key=True, autoincrement=True) session_id = Column(String(50), nullable=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True) ip_address = Column(String(50), nullable=True) user_agent = Column(Text, nullable=True) browser = Column(String(100), nullable=True) os = Column(String(100), nullable=True) device_type = Column(String(50), nullable=True) # Location data (JSON string or dict depending on DB) location_data = Column(JSON, nullable=True) # Extra metadata (screen resolution, language, etc.) client_metadata = Column(JSON, nullable=True) first_seen = Column(DateTime, default=lambda: datetime.now(timezone.utc), nullable=False) last_seen = Column(DateTime, default=lambda: datetime.now(timezone.utc), nullable=False) events = relationship("AnalyticsEvent", back_populates="visitor", cascade="all, delete-orphan") user = relationship("User") class AnalyticsEvent(Base): __tablename__ = "analytics_events" id = Column(Integer, primary_key=True, autoincrement=True) visitor_id = Column(Integer, ForeignKey("visitor_logs.id", ondelete="CASCADE"), nullable=False) event_type = Column(String(50), nullable=False, index=True) # PAGE_VIEW, ADD_TO_CART, SEARCH, etc. page_url = Column(Text, nullable=True) page_title = Column(Text, nullable=True) # Event data (e.g. {product_id: 123} for ADD_TO_CART) event_data = Column(JSON, nullable=True) created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), nullable=False) visitor = relationship("VisitorLog", back_populates="events")