Skip to content

Commit 4cbbc1e

Browse files
committed
API Integration
1 parent 3d909c2 commit 4cbbc1e

File tree

9 files changed

+86
-34
lines changed

9 files changed

+86
-34
lines changed

backend/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ yarn-debug.log*
2020
yarn-error.log*
2121

2222
# local env files
23-
.env*.local
23+
.env
24+
2425

2526
# vercel
2627
.vercel

backend/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"type": "module",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1",
8-
"dev": "tsx src/index.ts"
8+
"dev": "tsx src/index.ts",
9+
"build": "tsc"
910
},
1011
"keywords": [],
1112
"author": "Saurabh Kushwaha",

backend/src/controllers/movieController.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,15 @@ export const deleteMovie = async (req: Request, res: Response) => {
5050
}
5151
};
5252

53+
export const findMovie = async (req: Request, res: Response) => {
54+
const { id } = req.body;
55+
try {
56+
const movie = await prisma.movie.findUnique({
57+
where: { id },
58+
});
59+
res.status(200).json(movie);
60+
} catch (error) {
61+
res.status(500).json({ message: 'Movie not found', error });
62+
}
63+
};
64+

backend/src/routes/movieRoutes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Router } from 'express';
2-
import { addMovie, fetchMovies, deleteMovie, updateMovie } from '../controllers/movieController';
2+
import { addMovie, fetchMovies, deleteMovie, updateMovie , findMovie} from '../controllers/movieController';
33

44
const router = Router();
55

66
router.post('/add', addMovie);
77
router.get('/fetch', fetchMovies);
88
router.post('/delete', deleteMovie);
99
router.post('/update', updateMovie);
10+
router.post('/find',findMovie);
1011

1112
export default router;

moviewhub/src/api/moviesAPI.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import apiCall from "@/utils/apiCall";
22
import { Movie } from "@/utils/interfaces";
3-
import { addMovieURI, deleteMovieURI, fetchMovieURI, updateMovieURI } from "@/utils/apiURI";
3+
import { addMovieURI, deleteMovieURI, fetchMovieURI, findMovieURI, updateMovieURI } from "@/utils/apiURI";
44

55
export const addMovie = (movieData: Movie) => {
66
return apiCall({ method: 'POST', uri: addMovieURI, postData: movieData });
@@ -17,3 +17,7 @@ export const deleteMovie = (id:string) => {
1717
export const updateMovie = (movieData: Movie) => {
1818
return apiCall({ method: 'POST', uri: updateMovieURI, postData: movieData});
1919
};
20+
21+
export const findMovie = (id:string) => {
22+
return apiCall({ method: 'POST', uri: findMovieURI, postData: {id}});
23+
};

moviewhub/src/app/page.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const Home: React.FC = () => {
2121
try {
2222
setLoading(true);
2323
const movieData = await fetchMovies();
24-
console.log(movieData);
24+
// console.log(movieData);
2525
setMovielist(movieData);
2626
} catch (error) {
2727
console.error("Failed to fetch movies:", error);
@@ -36,10 +36,12 @@ const Home: React.FC = () => {
3636
const handleCreateMovie = async (name: string, releaseDate: string) => {
3737
try {
3838
const movieData = { name, releaseDate };
39-
await addMovie(movieData);
40-
setMovielist((prevMovielist) => [...prevMovielist, movieData]); // Correctly append the new movie
41-
console.log(`New Movie added: ${name}, Release Date: ${releaseDate}`);
39+
const newMovie = await addMovie(movieData);
40+
// console.log(newMovie);
41+
setMovielist((prevMovielist) => [...prevMovielist, newMovie]); // Correctly append the new movie
42+
// console.log(`New Movie added: ${name}, Release Date: ${releaseDate}`);
4243
setIsMovieModalOpen(false); // Close the modal after adding the movie
44+
return alert("Movie Added Successfully");
4345
} catch (error) {
4446
console.error("Failed to add movie:", error);
4547
}
@@ -50,7 +52,7 @@ const Home: React.FC = () => {
5052
try {
5153
const reviewData = { movieId, movieName, reviewerName, rating, comments };
5254
await addReview(reviewData);
53-
console.log(`Review added for ${movieName} by ${reviewerName}: Rating ${rating}/10, Comments: ${comments}`);
55+
console.log(`Review added for ${movieName} by ${reviewerName}: Rating ${rating}/10, Comments: ${comments}`);
5456
setIsReviewModalOpen(false); // Close the modal after adding the review
5557
} catch (error) {
5658
console.error("Failed to add review:", error);

moviewhub/src/app/review/[id]/page.tsx

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,105 @@
11
"use client";
2-
import React, { useState } from 'react';
2+
import React, { useState, useEffect } from 'react';
33
import { useParams } from 'next/navigation';
44
import Navbar from '@/components/Navbar';
55
import ReviewCard from '@/components/ReviewCard';
6-
import { movies } from '@/utils/data';
76
import AddMovieModal from '@/components/AddNewMovie';
87
import AddReviewModal from '@/components/AddNewReview';
8+
import { findMovie, fetchMovies } from '@/api/moviesAPI';
9+
import { Movie, Review } from '@/utils/interfaces';
10+
import Loader from '@/components/Loader';
911

1012
const ReviewPage: React.FC = () => {
1113
const params = useParams();
1214
const id = params.id;
13-
const movie = movies.find((movie) => movie.id === Number(id));
14-
15-
// State for managing modal visibility
1615
const [isAddMovieModalOpen, setAddMovieModalOpen] = useState(false);
1716
const [isAddReviewModalOpen, setAddReviewModalOpen] = useState(false);
17+
const [movie, setMovie] = useState<Movie | null>(null);
18+
const [movielist, setMovielist] = useState<Movie[]>([]);
19+
const [loading, setLoading] = useState(false);
20+
21+
useEffect(() => {
22+
const getMovie = async () => {
23+
try {
24+
setLoading(true);
25+
const movieData = await findMovie(id as string);
26+
const movies = await fetchMovies();
27+
setMovie(movieData);
28+
setMovielist(movies);
29+
} catch (error) {
30+
console.error("Failed to fetch movie:", error);
31+
} finally {
32+
setLoading(false);
33+
}
34+
};
35+
36+
getMovie();
37+
}, [id]);
1838

1939
const handleCreateMovie = (name: string, releaseDate: string) => {
2040
console.log(`New Movie: ${name}, Release Date: ${releaseDate}`);
2141
};
2242

23-
const handleAddReview = (movieName: string, reviewerName: string, rating: number, comments: string) => {
24-
console.log(`Review for ${movieName} by ${reviewerName}: Rating ${rating}/10, Comments: ${comments}`);
43+
const handleAddReview = (movieId: string, movieName: string, reviewerName: string, rating: number, comments: string) => {
44+
console.log(`Review for ${movieName} (${movieId}) by ${reviewerName}: Rating ${rating}/10, Comments: ${comments}`);
2545
};
2646

47+
if (loading) {
48+
return <Loader />;
49+
}
50+
2751
if (!movie) {
2852
return (
2953
<div>
30-
<Navbar
31-
onAddMovie={() => setAddMovieModalOpen(true)}
32-
onAddReview={() => setAddReviewModalOpen(true)}
54+
<Navbar
55+
onAddMovie={() => setAddMovieModalOpen(true)}
56+
onAddReview={() => setAddReviewModalOpen(true)}
3357
/>
3458
<div className="container mx-auto px-4 py-6">
3559
<h1 className="text-3xl font-bold mb-4 text-center">Review Not found</h1>
3660
</div>
3761
</div>
3862
);
3963
}
40-
64+
4165
const { name: movieName, reviews } = movie;
42-
// Calculate the average rating
43-
const totalRating = reviews.reduce((acc, review) => acc + review.rating, 0);
44-
const averageRating = reviews.length > 0 ? totalRating / reviews.length : 0;
66+
67+
// Check if there are any reviews
68+
const hasReviews = reviews && reviews.length > 0;
69+
const totalRating = hasReviews ? reviews.reduce((acc: number, review: Review) => acc + review.rating, 0) : 0;
70+
const averageRating = hasReviews ? totalRating / reviews.length : 0;
71+
4572

4673
return (
4774
<div className='w-full min-h-lvh'>
48-
<Navbar
49-
onAddMovie={() => setAddMovieModalOpen(true)}
50-
onAddReview={() => setAddReviewModalOpen(true)}
75+
<Navbar
76+
onAddMovie={() => setAddMovieModalOpen(true)}
77+
onAddReview={() => setAddReviewModalOpen(true)}
5178
/>
5279
<div className="container mx-auto px-4 py-6">
5380
<div className='flex justify-between'>
5481
<h1 className="text-3xl font-bold mb-4 ">{movieName}</h1>
55-
<h1 className="text-3xl font-bold mb-4 ">{averageRating}</h1>
82+
<h1 className="text-3xl font-bold mb-4 ">{averageRating.toFixed(1)}</h1>
5683
</div>
57-
84+
5885
<div className="grid grid-cols-1 gap-6">
59-
{reviews.map((review, index) => (
60-
<ReviewCard key={index} review={review} />
61-
))}
86+
{reviews && reviews.length > 0 ? (
87+
reviews.map((review, index) => (
88+
<ReviewCard key={index} review={review} />
89+
))
90+
) : (
91+
<p className="text-center text-gray-500">No reviews available for this movie.</p>
92+
)}
6293
</div>
6394
</div>
6495

65-
{/* Modals */}
66-
6796
<AddMovieModal
6897
isOpen={isAddMovieModalOpen}
6998
onClose={() => setAddMovieModalOpen(false)}
7099
onCreateMovie={handleCreateMovie}
71100
/>
72101
<AddReviewModal
102+
movielist={movielist}
73103
isOpen={isAddReviewModalOpen}
74104
onClose={() => setAddReviewModalOpen(false)}
75105
onAddReview={handleAddReview}

moviewhub/src/components/ReviewCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client"
2+
import { Review } from '@/utils/interfaces';
23
import React from 'react';
3-
import { Review } from '@/utils/data';
44

55
interface ReviewCardProps {
66
review: Review;

moviewhub/src/utils/apiURI.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const addMovieURI = `${BASE_URL}/movies/add`
55
export const fetchMovieURI = `${BASE_URL}/movies/fetch`
66
export const deleteMovieURI = `${BASE_URL}/movies/delete`
77
export const updateMovieURI = `${BASE_URL}/movies/update`
8+
export const findMovieURI = `${BASE_URL}/movies/find`
89

910
export const addReviewURI = `${BASE_URL}/reviews/add`
1011
export const fetchReviewURI = `${BASE_URL}/reviews/fetch`

0 commit comments

Comments
 (0)