153:class Recipient(Base, TimestampMixin):
154-    __tablename__ = "recipients"
155-    id = Column(Integer, primary_key=True)
156-    list_id = Column(Integer, ForeignKey("recipient_lists.id", ondelete="CASCADE"), nullable=False, index=True)
157-    email = Column(String(320), nullable=False, index=True)
158-    first_name = Column(String(150), default="")
159-    last_name = Column(String(150), default="")
160-    company_name = Column(String(250), default="")
161-    company_phone = Column(String(60), default="")
162-    customer_email = Column(String(320), default="")
163-    custom_fields = Column(JSON, default=dict)
164-    # validation / status
165-    status = Column(String(30), default="valid")  # valid|invalid|duplicate|suppressed|bounced
166-    validation_error = Column(Text, default="")
167-    is_valid = Column(Boolean, default=True, nullable=False)
168-    # unsubscribe token (unique secret per recipient)
169-    unsub_token = Column(String(64), unique=True, nullable=False)
170-
171-    list = relationship("RecipientList", back_populates="recipients")
172-
173-    __table_args__ = (Index("ix_recipient_list_email", "list_id", "email"),)
174-
175-
141:class RecipientList(Base, TimestampMixin):
142-    __tablename__ = "recipient_lists"
143-    id = Column(Integer, primary_key=True)
144-    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
145-    name = Column(String(200), nullable=False)
146-    description = Column(Text, default="")
147-    source = Column(String(30), default="manual")  # manual|csv|txt
148-    row_count = Column(Integer, default=0)
149-
150-    recipients = relationship("Recipient", back_populates="list", cascade="all, delete-orphan")
151-
