80 lines
3.1 KiB
Python
80 lines
3.1 KiB
Python
"""
|
|
Pydantic schemas for Reddit posts and comments.
|
|
|
|
This module defines request and response schemas for Reddit-related operations.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from typing import List
|
|
|
|
from pydantic import BaseModel, Field, ConfigDict
|
|
|
|
|
|
class RedditPostBase(BaseModel):
|
|
"""Base schema for Reddit post data."""
|
|
post_id: str = Field(..., description="Unique identifier from Reddit")
|
|
title: str = Field(..., min_length=1, max_length=500, description="Post title")
|
|
text: Optional[str] = Field(None, description="Post content")
|
|
upvotes: int = Field(default=0, ge=0, description="Number of upvotes")
|
|
created_at: datetime = Field(..., description="Timestamp when post was created")
|
|
match_id: Optional[int] = Field(None, description="Foreign key to matches table")
|
|
subreddit: str = Field(..., description="Subreddit name")
|
|
source: str = Field(default="reddit", description="Source platform")
|
|
|
|
|
|
class RedditPostCreate(RedditPostBase):
|
|
"""Schema for creating a new Reddit post."""
|
|
pass
|
|
|
|
|
|
class RedditPostResponse(RedditPostBase):
|
|
"""Schema for Reddit post response."""
|
|
id: int = Field(..., description="Primary key")
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class RedditCommentBase(BaseModel):
|
|
"""Base schema for Reddit comment data."""
|
|
comment_id: str = Field(..., description="Unique identifier from Reddit")
|
|
post_id: str = Field(..., description="Foreign key to posts_reddit table")
|
|
text: str = Field(..., min_length=1, description="Comment content")
|
|
upvotes: int = Field(default=0, ge=0, description="Number of upvotes")
|
|
created_at: datetime = Field(..., description="Timestamp when comment was created")
|
|
source: str = Field(default="reddit", description="Source platform")
|
|
|
|
|
|
class RedditCommentCreate(RedditCommentBase):
|
|
"""Schema for creating a new Reddit comment."""
|
|
pass
|
|
|
|
|
|
class RedditCommentResponse(RedditCommentBase):
|
|
"""Schema for Reddit comment response."""
|
|
id: int = Field(..., description="Primary key")
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class RedditPostListResponse(BaseModel):
|
|
"""Schema for a list of Reddit posts."""
|
|
data: list[RedditPostResponse]
|
|
count: int = Field(..., description="Total number of posts")
|
|
meta: dict = Field(default_factory=dict, description="Additional metadata")
|
|
|
|
|
|
class RedditCommentListResponse(BaseModel):
|
|
"""Schema for a list of Reddit comments."""
|
|
data: list[RedditCommentResponse]
|
|
count: int = Field(..., description="Total number of comments")
|
|
meta: dict = Field(default_factory=dict, description="Additional metadata")
|
|
|
|
|
|
class RedditStatsResponse(BaseModel):
|
|
"""Schema for Reddit statistics."""
|
|
total_posts: int = Field(..., description="Total number of Reddit posts")
|
|
total_comments: int = Field(..., description="Total number of Reddit comments")
|
|
posts_by_subreddit: dict = Field(..., description="Breakdown by subreddit")
|
|
posts_by_match: dict = Field(..., description="Breakdown by match")
|
|
avg_post_upvotes: float = Field(..., description="Average post upvotes")
|
|
avg_comment_upvotes: float = Field(..., description="Average comment upvotes")
|