47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
"""
|
|
Pydantic schemas for RSS articles.
|
|
|
|
This module defines request and response schemas for RSS article-related operations.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, Field, ConfigDict
|
|
|
|
|
|
class RSSArticleBase(BaseModel):
|
|
"""Base schema for RSS article data."""
|
|
article_id: str = Field(..., description="Unique identifier from RSS feed")
|
|
title: str = Field(..., min_length=1, max_length=500, description="Article title")
|
|
content: Optional[str] = Field(None, description="Article content/description")
|
|
published_at: datetime = Field(..., description="Timestamp when article was published")
|
|
source_url: str = Field(..., min_length=1, max_length=1000, description="URL of RSS feed source")
|
|
match_id: Optional[int] = Field(None, description="Foreign key to matches table")
|
|
source: str = Field(default="rss", description="Source feed name")
|
|
|
|
|
|
class RSSArticleCreate(RSSArticleBase):
|
|
"""Schema for creating a new RSS article."""
|
|
pass
|
|
|
|
|
|
class RSSArticleResponse(RSSArticleBase):
|
|
"""Schema for RSS article response."""
|
|
id: int = Field(..., description="Primary key")
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class RSSArticleListResponse(BaseModel):
|
|
"""Schema for a list of RSS articles."""
|
|
data: list[RSSArticleResponse]
|
|
count: int = Field(..., description="Total number of articles")
|
|
meta: dict = Field(default_factory=dict, description="Additional metadata")
|
|
|
|
|
|
class RSSArticleStatsResponse(BaseModel):
|
|
"""Schema for RSS article statistics."""
|
|
total_articles: int = Field(..., description="Total number of articles")
|
|
articles_by_source: dict = Field(..., description="Breakdown by source feed")
|
|
articles_by_match: dict = Field(..., description="Breakdown by match")
|