from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey from sqlalchemy.orm import relationship from app.db.session import Base from app.models.base import TimestampMixin, TableNameMixin class NewsSource(Base, TimestampMixin, TableNameMixin): """Model for news sources.""" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True, nullable=False) source_id = Column(String, unique=True, index=True, nullable=False) url = Column(String, nullable=True) # Relationships articles = relationship("NewsArticle", back_populates="source") class NewsCategory(Base, TimestampMixin, TableNameMixin): """Model for news categories.""" id = Column(Integer, primary_key=True, index=True) name = Column(String, unique=True, index=True, nullable=False) # Relationships articles = relationship("NewsArticle", back_populates="category") class NewsArticle(Base, TimestampMixin, TableNameMixin): """Model for news articles.""" id = Column(Integer, primary_key=True, index=True) title = Column(String, index=True, nullable=False) description = Column(Text, nullable=True) content = Column(Text, nullable=True) url = Column(String, unique=True, index=True, nullable=False) image_url = Column(String, nullable=True) published_at = Column(DateTime, index=True, nullable=False) author = Column(String, nullable=True) language = Column(String, nullable=True) country = Column(String, nullable=True) # Foreign keys source_id = Column(Integer, ForeignKey("newssource.id"), nullable=True) category_id = Column(Integer, ForeignKey("newscategory.id"), nullable=True) # Relationships source = relationship("NewsSource", back_populates="articles") category = relationship("NewsCategory", back_populates="articles") saved_by = relationship("SavedArticle", back_populates="article", cascade="all, delete-orphan") class SavedArticle(Base, TimestampMixin, TableNameMixin): """Model for articles saved by users.""" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("user.id"), nullable=False) article_id = Column(Integer, ForeignKey("newsarticle.id"), nullable=False) notes = Column(Text, nullable=True) # Relationships user = relationship("User", back_populates="saved_articles") article = relationship("NewsArticle", back_populates="saved_by") class UserPreference(Base, TimestampMixin, TableNameMixin): """Model for user preferences.""" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("user.id"), nullable=False) keywords = Column(String, nullable=True) sources = Column(String, nullable=True) # Comma-separated source IDs categories = Column(String, nullable=True) # Comma-separated category names countries = Column(String, nullable=True) # Comma-separated country codes languages = Column(String, nullable=True) # Comma-separated language codes # Relationships user = relationship("User", back_populates="preferences")