import ulid from sqlalchemy import Column, String, Boolean, DateTime, func, ForeignKey from sqlalchemy.orm import relationship from app.core.database.db_session import Base class EcomCustomer(Base): __tablename__ = "ecom_customers" customer_id = Column(String(26), primary_key=True, default=lambda: str(ulid.ULID())) google_id = Column(String(128), unique=True, index=True, nullable=True) email = Column(String(255), unique=True, index=True, nullable=False) password_hash = Column(String(255), nullable=True) first_name = Column(String(100), nullable=False) last_name = Column(String(100), nullable=False) phone = Column(String(30), unique=True, index=True, nullable=True) profile_picture = Column(String(1024), nullable=True) is_active = Column(Boolean, default=True) email_verified = Column(Boolean, default=False) phone_verified = Column(Boolean, default=False) last_login = Column(DateTime, nullable=True) created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) # Relationships orders = relationship("Order", back_populates="customer") addresses = relationship("CustomerAddress", back_populates="customer", cascade="all, delete-orphan") refresh_tokens = relationship("CustomerRefreshToken", back_populates="customer", cascade="all, delete-orphan") class CustomerAddress(Base): __tablename__ = "customer_addresses" address_id = Column(String(26), primary_key=True, default=lambda: str(ulid.ULID())) customer_id = Column(String(26), ForeignKey("ecom_customers.customer_id", ondelete="CASCADE"), nullable=False, index=True) address_type = Column(String(20), default="SHIPPING") # SHIPPING, BILLING full_name = Column(String(150), nullable=False) phone = Column(String(30), nullable=False) street_address = Column(String(255), nullable=False) city = Column(String(100), nullable=False) state = Column(String(100), nullable=False) pincode = Column(String(20), nullable=False, index=True) is_default = Column(Boolean, default=False) created_at = Column(DateTime, server_default=func.now()) customer = relationship("EcomCustomer", back_populates="addresses") class CustomerRefreshToken(Base): __tablename__ = "customer_refresh_tokens" id = Column(String(26), primary_key=True, default=lambda: str(ulid.ULID())) customer_id = Column(String(26), ForeignKey("ecom_customers.customer_id", ondelete="CASCADE"), nullable=False, index=True) token_hash = Column(String(255), unique=True, index=True, nullable=False) token_family_id = Column(String(26), nullable=False, index=True) expires_at = Column(DateTime, nullable=False) created_at = Column(DateTime, server_default=func.now()) revoked_at = Column(DateTime, nullable=True) last_used_at = Column(DateTime, nullable=True) user_agent = Column(String(255), nullable=True) ip_address = Column(String(45), nullable=True) customer = relationship("EcomCustomer", back_populates="refresh_tokens")