
- 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.
79 lines
3.1 KiB
Python
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") |