Cinewatch-recommender / api /schemas.py
IntimateUser6969
Deploy CineMatch backend: Two-Tower + DeepFM + MMR + Upstash Redis
1359487
Raw
History Blame Contribute Delete
2.88 kB
"""Pydantic schemas for request/response validation."""
from __future__ import annotations
from typing import Any, Optional
from pydantic import BaseModel, Field
# ------------------------------------------------------------------
# Movie schemas
# ------------------------------------------------------------------
class Movie(BaseModel):
movie_id: int
title: str
year: int
genres: list[str]
class RecommendedMovie(Movie):
score: float
explanation: str
# ------------------------------------------------------------------
# Recommendation response
# ------------------------------------------------------------------
class RecommendationResponse(BaseModel):
user_id: int
recommendations: list[RecommendedMovie]
total: int
# ------------------------------------------------------------------
# Search
# ------------------------------------------------------------------
class SearchResponse(BaseModel):
query: str
results: list[Movie]
total: int
# ------------------------------------------------------------------
# Movie detail
# ------------------------------------------------------------------
class MovieDetailResponse(Movie):
similar_movies: list[Movie] = []
avg_rating: Optional[float] = None
rating_count: Optional[int] = None
# ------------------------------------------------------------------
# Taste profile
# ------------------------------------------------------------------
class TasteProfileResponse(BaseModel):
user_id: int
genre_preferences: dict[str, float]
avg_rating: float
rating_count: int
top_genres: list[str]
# ------------------------------------------------------------------
# Feedback
# ------------------------------------------------------------------
class FeedbackRequest(BaseModel):
user_id: int
movie_id: int
action: str = Field(..., description="One of: thumbs_up, thumbs_down, skip, watch")
mood: Optional[str] = Field(None, description="Optional mood tag: happy, sad, excited, etc.")
rating: Optional[float] = Field(None, ge=1.0, le=5.0)
class FeedbackResponse(BaseModel):
success: bool
message: str
# ------------------------------------------------------------------
# Event logging
# ------------------------------------------------------------------
class EventRequest(BaseModel):
user_id: int
event_type: str # view, click, rating, search, feedback
movie_id: Optional[int] = None
metadata: Optional[dict[str, Any]] = None
class EventResponse(BaseModel):
event_id: str
success: bool
# ------------------------------------------------------------------
# Health check
# ------------------------------------------------------------------
class HealthResponse(BaseModel):
status: str
models_loaded: bool
faiss_index_size: int
num_users: int
num_movies: int