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