From d5ae6b9f3f50ee7e330a68e4f62d622a715fc143 Mon Sep 17 00:00:00 2001 From: chaaanuwu Date: Fri, 8 May 2026 17:27:43 +0530 Subject: [PATCH] feat: Enhance movie search functionality by integrating TMDB results and improving error handling --- client/src/pages/SearchResultPage.jsx | 3 +- server/controllers/movie.controller.js | 58 +++++++++++++++++++++----- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/client/src/pages/SearchResultPage.jsx b/client/src/pages/SearchResultPage.jsx index 31ed361..7464eb8 100644 --- a/client/src/pages/SearchResultPage.jsx +++ b/client/src/pages/SearchResultPage.jsx @@ -43,6 +43,7 @@ export default function SearchResultPage() { } if (movieRes.status === "fulfilled") { + console.log("Movies found:", movieRes.value.data.movies); setMovies(movieRes.value?.data.movies || []); } else { console.error("Movies failed:", movieRes.reason); @@ -101,7 +102,7 @@ export default function SearchResultPage() { {movies.length > 0 ? (
{movies.map((m) => ( - + ))}
) : ( diff --git a/server/controllers/movie.controller.js b/server/controllers/movie.controller.js index f4c6b38..e2e57bc 100644 --- a/server/controllers/movie.controller.js +++ b/server/controllers/movie.controller.js @@ -1,6 +1,7 @@ import axios from "axios"; import Movie from "../models/movie.model.js"; import { TMDB_BASE_URL, TMDB_KEY } from "../config/env.js"; +import { getOrCreateMovie } from "../services/movie.service.js"; export const getMovieById = async (req, res) => { const movieId = req.params.id; @@ -20,25 +21,62 @@ export const getMovieById = async (req, res) => { } }; + +/* + Helper function to fetch movies from TMDB based on a search query. +*/ +const fetchMoviesFromTMDB = async (query) => { + const response = await axios.get(`${TMDB_BASE_URL}/search/movie`, { + params: { + api_key: TMDB_KEY, + query + } + }); + + return response.data.results; +}; + export const searchMovie = async (req, res) => { try { const query = req.query.q; if (!query || query.trim() === "") { - return res.status(400).json({ success: false, error: "Query parameter 'q' is required" }); + return res.status(400).json({ + success: false, + error: "Query parameter 'q' is required" + }); } - const movies = await axios.get(`${TMDB_BASE_URL}/search/movie`, { - params: { - api_key: TMDB_KEY, - query: query - } + // Search DB first + let movies = await Movie.find({ + title: { $regex: query, $options: "i" } }); - res.status(200).json({ success: true, movies: movies.data.results }); + // If no movies in DB -> fetch from TMDB + if (movies.length === 0) { + const tmdbMovies = await fetchMoviesFromTMDB(query); + + for (const tmdbMovie of tmdbMovies) { + await getOrCreateMovie(tmdbMovie.title); + } + + // Search again after saving + movies = await Movie.find({ + title: { $regex: query, $options: "i" } + }); + } + + return res.status(200).json({ + success: true, + movies + }); } catch (error) { - console.error("Error searching movie: ", error); - res.status(500).json({ message: "Failed to search movie" }); + console.error("Error searching movie:", error); + + return res.status(500).json({ + success: false, + message: "Failed to search movie" + }); } -} \ No newline at end of file +}; \ No newline at end of file