diff --git a/client/src/api/movie.api.js b/client/src/api/movie.api.js index 84e9f92..ec17aac 100644 --- a/client/src/api/movie.api.js +++ b/client/src/api/movie.api.js @@ -8,4 +8,14 @@ export const getMovieById = async (id) => { console.error("Error fetching movie: ", error); throw error; } +} + +export const searchMovies = async (title) => { + try { + const response = await axiosInstance.get(`/movies/search?q=${title}`); + return response; + } catch (error) { + console.error("Error searching movie: ", error); + throw error; + } } \ No newline at end of file diff --git a/client/src/assets/popcorn-cup.png b/client/src/assets/popcorn-cup.png new file mode 100644 index 0000000..ab38d65 Binary files /dev/null and b/client/src/assets/popcorn-cup.png differ diff --git a/client/src/components/ui/MovieCard.jsx b/client/src/components/ui/MovieCard.jsx index c902d39..33fa275 100644 --- a/client/src/components/ui/MovieCard.jsx +++ b/client/src/components/ui/MovieCard.jsx @@ -1,5 +1,7 @@ import { motion } from "framer-motion"; +import popcornCup from "../../assets/popcorn-cup.png" + export default function MovieCard({ id, title, @@ -19,7 +21,7 @@ export default function MovieCard({ {/* Poster Container */}
{`${title}

- {releaseYear} + {releaseYear?.toString()}

diff --git a/client/src/pages/EditProfile.jsx b/client/src/pages/EditProfile.jsx index 4468cff..5b74302 100644 --- a/client/src/pages/EditProfile.jsx +++ b/client/src/pages/EditProfile.jsx @@ -18,23 +18,31 @@ export default function EditProfile() { e.preventDefault(); setLoading(true); try { - const formData = new FormData(); - formData.append("file", selectedPfpFile); - formData.append("upload_preset", import.meta.env.VITE_CLOUDINARY_PRESET); - formData.append("folder", import.meta.env.VITE_CLOUDINARY_ASSET_FOLDER); + setLoading(true); + let imageUrl = user.user.pfp; - const cloudName = import.meta.env.VITE_CLOUDINARY_CLOUD; + if (selectedPfpFile) { + const formData = new FormData(); + formData.append("file", selectedPfpFile); + formData.append("upload_preset", import.meta.env.VITE_CLOUDINARY_PRESET); + formData.append("folder", import.meta.env.VITE_CLOUDINARY_ASSET_FOLDER); - const cloudinaryRes = await axios.post( - `https://api.cloudinary.com/v1_1/${cloudName}/image/upload`, - formData - ); + const cloudName = import.meta.env.VITE_CLOUDINARY_CLOUD; + + const cloudinaryRes = await axios.post( + `https://api.cloudinary.com/v1_1/${cloudName}/image/upload`, + formData + ); + + imageUrl = cloudinaryRes.data.secure_url; + } + + const res = await editProfileData(imageUrl, about); - const res = await editProfileData(cloudinaryRes.data.secure_url, about); if (res.success) { setUser({ ...user, user: res.user }); + setLoading(false); } - setLoading(false); } catch (err) { console.error(err); setLoading(false); @@ -44,7 +52,7 @@ export default function EditProfile() { return (
- {/* Header */} +
@@ -100,7 +108,7 @@ export default function EditProfile() {
- {/* Bio / About Section */} + {/* Bio Section */}

Director's Statement

@@ -117,7 +125,6 @@ export default function EditProfile() {
- {/* Actions */}
@@ -82,7 +101,7 @@ export default function SearchResultPage() { {movies.length > 0 ? (
{movies.map((m) => ( - + ))}
) : ( @@ -130,13 +149,13 @@ function SectionHeader({ title, count, icon }) { function UserResultCard({ user }) { return ( - - {user.firstName}
diff --git a/server/controllers/history.controller.js b/server/controllers/history.controller.js index 4ea673e..dbace2d 100644 --- a/server/controllers/history.controller.js +++ b/server/controllers/history.controller.js @@ -219,50 +219,6 @@ export const removeWatchedMovie = async (req, res) => { } }; - - - - - - - - - - - - - - - - - - - - - - - - -// /** -// * Remove a watched movie -// */ -// export const removeWatchedMovie = async (req, res) => { -// try { -// const { movieId } = req.params; -// const userId = req.user.userId; - -// const movie = await History.findOneAndDelete({ movieId, userId }); -// if (!movie) { -// return res.status(404).json({ success: false, message: 'Movie not found in watched list' }); -// } - -// res.status(200).json({ success: true, message: `${movie.title} removed from watched list`, data: movie }); -// } catch (error) { -// console.error(error); -// res.status(500).json({ success: false, error: 'Server error' }); -// } -// }; - /** * Get another user's watched movies (public) */ diff --git a/server/controllers/movie.controller.js b/server/controllers/movie.controller.js index 4e1ff0a..f4c6b38 100644 --- a/server/controllers/movie.controller.js +++ b/server/controllers/movie.controller.js @@ -1,4 +1,6 @@ +import axios from "axios"; import Movie from "../models/movie.model.js"; +import { TMDB_BASE_URL, TMDB_KEY } from "../config/env.js"; export const getMovieById = async (req, res) => { const movieId = req.params.id; @@ -16,4 +18,27 @@ export const getMovieById = async (req, res) => { console.error("Error fetching movie: ", error); res.status(500).json({ message: "Failed to fetch movie" }); } -}; \ No newline at end of file +}; + +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" }); + } + + const movies = await axios.get(`${TMDB_BASE_URL}/search/movie`, { + params: { + api_key: TMDB_KEY, + query: query + } + }); + + res.status(200).json({ success: true, movies: movies.data.results }); + + } catch (error) { + console.error("Error searching movie: ", error); + res.status(500).json({ message: "Failed to search movie" }); + } +} \ No newline at end of file diff --git a/server/database/mongodb.js b/server/database/mongodb.js index d201144..b674fb2 100644 --- a/server/database/mongodb.js +++ b/server/database/mongodb.js @@ -1,5 +1,4 @@ -import mongoose from "mongoose"; - +import * as mongoose from "mongoose"; import { DB_URI, NODE_ENV } from "../config/env.js"; if (!DB_URI) { @@ -9,9 +8,9 @@ if (!DB_URI) { const connectToDatabase = async () => { try { await mongoose.connect(DB_URI); - console.log(`Connected to MongoDB in ${NODE_ENV} mode`); + console.log("Database connected successfully in " + NODE_ENV + " environment"); } catch (error) { - console.error("Error connecting to MongoDB: ", Error); + console.log("DB connection error:", error); process.exit(1); } } diff --git a/server/routes/movie.route.js b/server/routes/movie.route.js index b9ce7d6..a3c9ca1 100644 --- a/server/routes/movie.route.js +++ b/server/routes/movie.route.js @@ -1,9 +1,11 @@ import { Router } from "express"; import authorize from "../middlewares/auth.middleware.js"; -import { getMovieById } from "../controllers/movie.controller.js"; +import { getMovieById, searchMovie } from "../controllers/movie.controller.js"; const movieRouter = Router(); +movieRouter.get('/search', authorize, searchMovie); + movieRouter.get('/:id', authorize, getMovieById); export default movieRouter; \ No newline at end of file