# ------------------------------------------------- # 1️⃣ Search Movies # ------------------------------------------------- @app.get("/search", response_model=List[schemas.MovieOut]) def search_movies( q: str = Query(..., description="Search term"), genre: Optional[str] = None, year: Optional[int] = None, limit: int = 20, db: Session = Depends(auth.get_db) ): """ Full‑text / trigram fuzzy search on title + optional filters. """ return crud.search_movies(db, q, genre, year, limit)

# ------------------------------------------------- # 5️⃣ Notification subscription (price‑drop) # ------------------------------------------------- @app.post("/me/alerts", response_model=schemas.AlertOut) def create_price_alert( payload: schemas.AlertIn, user: models.User = Depends(auth.get_current_user), db: Session = Depends(auth.get_db) ): return crud.create_price_alert(db, user.id, payload) class MovieOut(BaseModel): id: int title: str year: Optional[int] poster_url: Optional[str] rating_imdb: Optional[float]

-- OTT Links (one movie can have many platforms) CREATE TABLE platforms ( id BIGSERIAL PRIMARY KEY, name TEXT NOT NULL, logo_url TEXT, affiliate_template TEXT -- e.g. "https://partner.com/checkout?movie=imdb_id" );

class Config: orm_mode = True