| from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint, func | |
| from app.db.engine import Base | |
| class ArticleItem(Base): | |
| __tablename__ = "article_items" | |
| __table_args__ = ( | |
| UniqueConstraint("platform", "article_id", name="uq_article_platform_article_id"), | |
| UniqueConstraint("platform", "url_hash", name="uq_article_platform_url_hash"), | |
| ) | |
| id = Column(Integer, primary_key=True, autoincrement=True) | |
| platform = Column(String, nullable=False) | |
| article_id = Column(String, nullable=False, default="") | |
| url = Column(Text, nullable=False) | |
| url_hash = Column(String, nullable=False) | |
| title = Column(String, nullable=False) | |
| author_name = Column(String, nullable=False, default="") | |
| author_id = Column(String, nullable=False, default="") | |
| summary_status = Column(String, nullable=False, default="pending") | |
| task_id = Column(String, nullable=False, default="") | |
| cover_url = Column(Text, nullable=False, default="") | |
| published_at = Column(String, nullable=False, default="") | |
| content_text = Column(Text, nullable=False, default="") | |
| discovered_at = Column(DateTime, server_default=func.now()) | |
| raw_metadata = Column(Text, nullable=False, default="{}") | |
| class ArticleSubscription(Base): | |
| __tablename__ = "article_subscriptions" | |
| id = Column(Integer, primary_key=True, autoincrement=True) | |
| platform = Column(String, nullable=False) | |
| type = Column(String, nullable=False) | |
| query = Column(Text, nullable=False) | |
| label = Column(String, nullable=False, default="") | |
| enabled = Column(Boolean, nullable=False, default=True) | |
| last_refresh_at = Column(DateTime, nullable=True) | |
| last_error = Column(Text, nullable=False, default="") | |
| created_at = Column(DateTime, server_default=func.now()) | |
| updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) | |
| class ArticleSubscriptionItem(Base): | |
| __tablename__ = "article_subscription_items" | |
| __table_args__ = ( | |
| UniqueConstraint("subscription_id", "article_item_id", name="uq_subscription_article_item"), | |
| ) | |
| id = Column(Integer, primary_key=True, autoincrement=True) | |
| subscription_id = Column(Integer, ForeignKey("article_subscriptions.id"), nullable=False) | |
| article_item_id = Column(Integer, ForeignKey("article_items.id"), nullable=False) | |
| matched_at = Column(DateTime, server_default=func.now()) | |
| match_reason = Column(Text, nullable=False, default="") | |