Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 33 additions & 2 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from contextlib import asynccontextmanager
from fastapi import FastAPI, HTTPException

from api.schemas import RecommendationRequest, RecommendationResponse, MovieRecommendation
from api.schemas import RecommendationRequest, RecommendationResponse, MovieRecommendation, HistoryResponse
from api.services import get_recommendations
from src.data import load_dataset
from src.utils import get_logger
Expand All @@ -22,6 +22,7 @@ async def lifespan(app: FastAPI):
logger.info("Loading datasets at startup...")
data = load_dataset()
datasets["movies"] = data["movies"]
datasets["ratings"] = data["ratings"]
logger.info("Datasets loaded successfully")
yield
logger.info("Shutting down API...")
Expand Down Expand Up @@ -61,4 +62,34 @@ def recommend(request: RecommendationRequest):
recommendations=[
MovieRecommendation(**r) for r in recommendations
]
)
)

@app.get("/user/{user_id}/history", response_model=HistoryResponse)
def get_user_history(user_id: int):

movies = datasets.get("movies")
ratings = datasets.get("ratings")

if movies is None or ratings is None:
raise HTTPException(status_code=500, detail="Datasets not loaded")

# get user ratings
user_ratings = ratings[ratings["user_id"] == user_id]

if user_ratings.empty:
raise HTTPException(status_code=404, detail=f"User {user_id} not found")

# get top rated movies
top_rated = user_ratings.sort_values("rating", ascending=False).head(10)

history = []
for _, row in top_rated.iterrows():
title = movies[movies["movie_id"] == row["movie_id"]]["title"].values
if len(title) > 0:
history.append({
"movie_id": int(row["movie_id"]),
"title": title[0],
"rating": float(row["rating"])
})

return HistoryResponse(user_id=user_id, history=history)
11 changes: 10 additions & 1 deletion api/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,13 @@ class MovieRecommendation(BaseModel):
class RecommendationResponse(BaseModel):
"""Schema for recommendation response."""
user_id: int
recommendations: List[MovieRecommendation]
recommendations: List[MovieRecommendation]

class WatchedMovie(BaseModel):
movie_id: int
title: str
rating: float

class HistoryResponse(BaseModel):
user_id: int
history: List[WatchedMovie]
Loading
Loading