From b6dae523db4e8c2414ac5e85ae23e265a4bf04c1 Mon Sep 17 00:00:00 2001 From: chaaanuwu Date: Mon, 4 May 2026 10:33:18 +0530 Subject: [PATCH 1/2] feat: Improve profile image upload handling and change local db to mongo atlas Co-authored-by: Copilot --- client/src/pages/EditProfile.jsx | 35 +++++++++++++++++++------------- server/database/mongodb.js | 7 +++---- 2 files changed, 24 insertions(+), 18 deletions(-) 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/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