Automated Action 90c1cdef34 Setup News Aggregation Service
- Fix code linting issues
- Update README with detailed documentation
- Configure database paths for the current environment
- Create necessary directory structure

The News Aggregation Service is now ready to use with FastAPI and SQLite.
2025-05-27 18:50:11 +00:00

79 lines
3.1 KiB
Python

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")