from datetime import datetime from sqlalchemy import Column, Integer, String, Text, DateTime, Enum as SQLEnum from sqlalchemy.sql import func from database import Base import enum class PortfolioType(str, enum.Enum): """Enum for portfolio item types""" POSTER = "poster" VIDEO = "video" WEBSITE = "website" class User(Base): """User model for authentication""" __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String(255), unique=True, index=True, nullable=False) password = Column(String(255), nullable=False) def __repr__(self): return f"" class PortfolioItem(Base): """Portfolio item model""" __tablename__ = "portfolio_items" id = Column(Integer, primary_key=True, index=True) title = Column(String(255), nullable=False, index=True) description = Column(Text, nullable=True) type = Column(SQLEnum(PortfolioType), nullable=False, index=True) image_url = Column(String(1024), nullable=True) video_url = Column(String(1024), nullable=True) video_thumbnail = Column(String(1024), nullable=True) website_url = Column(String(1024), nullable=True) what = Column(Text, nullable=True) sort_order = Column(Integer, default=0, nullable=False, server_default="0") created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False ) def __repr__(self): return f"" class NewsletterSubscriber(Base): """Newsletter subscriber model to store contacts locally""" __tablename__ = "newsletter_subscribers" id = Column(Integer, primary_key=True, index=True) email = Column(String(255), unique=True, index=True, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) def __repr__(self): return f"" class VisitorTelemetry(Base): """Visitor Telemetry / Cookie Tracking model""" __tablename__ = "visitor_telemetry" id = Column(Integer, primary_key=True, index=True) visitor_id = Column(String(100), nullable=True) session_id = Column(String(100), nullable=True) ip_address = Column(String(50), nullable=True) user_agent = Column(Text, nullable=True) referrer = Column(String(255), nullable=True) landing_page = Column(String(255), nullable=True) browser = Column(String(50), nullable=True) device_type = Column(String(50), nullable=True) os = Column(String(50), nullable=True) country = Column(String(100), nullable=True) city = Column(String(100), nullable=True) visit_count = Column(Integer, default=1, nullable=True) consent = Column(String(50), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) def __repr__(self): return f""