Skip to content

Commit 16523c2

Browse files
committed
change getPost to associate with specific movie ID in community posts
1 parent 54d7dde commit 16523c2

File tree

8 files changed

+90
-37
lines changed

8 files changed

+90
-37
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.20 on 2025-05-24 16:32
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('api', '0007_alter_userprofile_avatar'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='note',
15+
name='movie_imdb_id',
16+
field=models.CharField(blank=True, max_length=20, null=True),
17+
),
18+
migrations.AddField(
19+
model_name='note',
20+
name='movie_title',
21+
field=models.CharField(blank=True, max_length=200, null=True),
22+
),
23+
]

backend/api/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class Note(models.Model):
4444
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notes")
4545
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='replies')
4646
edited = models.BooleanField(default=False)
47+
movie_imdb_id = models.CharField(max_length=20, null=True, blank=True) # Store IMDb ID of the movie
48+
movie_title = models.CharField(max_length=200, null=True, blank=True) # Store movie title for easier querying
4749

4850
class Meta:
4951
ordering = ['-created_at']

backend/api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Meta:
3232
model = Note
3333
fields = ["id", "title", "content", "created_at", "updated_at", "author",
3434
"author_username", "author_id", "author_avatar", "time_ago",
35-
"edited", "replies", "reply_count", "parent"]
35+
"edited", "replies", "reply_count", "parent", "movie_imdb_id", "movie_title"]
3636
extra_kwargs = {"author": {"read_only": True}}
3737

3838
def get_replies(self, obj):

backend/api/views.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,22 @@ class NoteListCreate(generics.ListCreateAPIView):
1313
permission_classes = [permissions.IsAuthenticated]
1414

1515
def get_queryset(self):
16+
movie_imdb_id = self.request.query_params.get('movie_imdb_id', None)
17+
if movie_imdb_id:
18+
return Note.objects.filter(
19+
parent=None,
20+
movie_imdb_id=movie_imdb_id
21+
).order_by('-created_at')
1622
return Note.objects.filter(parent=None).order_by('-created_at')
1723

1824
def perform_create(self, serializer):
19-
serializer.save(author=self.request.user)
25+
movie_imdb_id = self.request.data.get('movie_imdb_id')
26+
movie_title = self.request.data.get('movie_title')
27+
serializer.save(
28+
author=self.request.user,
29+
movie_imdb_id=movie_imdb_id,
30+
movie_title=movie_title
31+
)
2032

2133
class NoteDetail(generics.RetrieveUpdateDestroyAPIView):
2234
queryset = Note.objects.all()

backend/mydatabase

0 Bytes
Binary file not shown.

frontend/src/App.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import NotFound from "./pages/NotFound"
77
import ProtectedRoute from "./components/ProtectedRoute"
88
import Home from "./pages/Home"
99
import Welcome from "./pages/Welcome"
10-
import ActiveOrders from "./pages/ActiveOrders"
10+
import Spotlight from "./pages/Spotlight"
1111
import Menu from "./pages/Menu"
1212
import Profile from "./pages/Profile"
1313

@@ -34,9 +34,9 @@ function App() {
3434
}
3535
>
3636
<Route index element={<Welcome />} />
37-
<Route path="active-orders" element={<ActiveOrders />} />
37+
<Route path="spotlight" element={<Spotlight />} />
3838
<Route path="menu" element={<Menu />} />
39-
<Route path="order-history" element={<Profile />} />
39+
<Route path="profile" element={<Profile />} />
4040
</Route>
4141

4242
<Route path="/login" element={<Login />} />

frontend/src/components/Sidebar.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const Sidebar = () => {
3939
<h2 className="logo">Flicks</h2>
4040
<nav>
4141
<NavLink to="/" end className={getLinkClass}>Home</NavLink>
42-
<NavLink to="/active-orders" className={getLinkClass}>Spotlight</NavLink>
42+
<NavLink to="/spotlight" className={getLinkClass}>Spotlight</NavLink>
4343
{/* TO DO: Add chat functionality */}
4444
{/* <NavLink to="/menu" className={getLinkClass}>Chat</NavLink> */}
4545
<div className="profile-menu" ref={dropdownRef}>
@@ -55,8 +55,8 @@ const Sidebar = () => {
5555
</button>
5656
{showDropdown && (
5757
<div className="dropdown-menu">
58-
<NavLink to="/order-history" className="dropdown-item">
59-
Dashboard
58+
<NavLink to="/profile" className="dropdown-item">
59+
Profile
6060
</NavLink>
6161
<NavLink to="/logout" className="dropdown-item">
6262
Logout
Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import SoundtrackWidget from "../components/SoundtrackWidget"
55
import "../style/Home.css"
66
import "../style/MovieReviews.css"
77

8-
const MovieReviews = () => {
8+
const Spotlight = () => {
99
const [posts, setPosts] = useState([]);
1010
const [postContent, setPostContent] = useState("");
1111
const [postTitle, setPostTitle] = useState("");
@@ -27,7 +27,9 @@ const MovieReviews = () => {
2727
const savedDate = localStorage.getItem('movieDate');
2828

2929
if (savedMovie && savedDate === today) {
30-
setDailyMovie(JSON.parse(savedMovie));
30+
const movie = JSON.parse(savedMovie);
31+
setDailyMovie(movie);
32+
getMovieReviews(movie.imdbID);
3133
setLoading(false);
3234
return;
3335
}
@@ -42,6 +44,7 @@ const MovieReviews = () => {
4244

4345
if (data.Response === "True") {
4446
setDailyMovie(data);
47+
getMovieReviews(data.imdbID);
4548
localStorage.setItem('dailyMovie', JSON.stringify(data));
4649
localStorage.setItem('movieDate', today);
4750
}
@@ -52,7 +55,6 @@ const MovieReviews = () => {
5255
};
5356

5457
useEffect(() => {
55-
getPosts();
5658
getDailyMovie();
5759
getCurrentUser();
5860
}, []);
@@ -66,28 +68,37 @@ const MovieReviews = () => {
6668
}
6769
};
6870

69-
const getPosts = () => {
70-
api.get("/api/notes/")
71-
.then((res) => res.data)
72-
.then((data) => setPosts(data))
73-
.catch((err) => console.error("Failed to fetch posts:", err));
71+
const getMovieReviews = async (imdbId) => {
72+
try {
73+
const response = await api.get("/api/notes/", {
74+
params: { movie_imdb_id: imdbId }
75+
});
76+
setPosts(response.data);
77+
} catch (err) {
78+
console.error("Failed to fetch movie reviews:", err);
79+
}
7480
};
7581

76-
const deletePost = (id) => {
77-
api.delete(`/api/notes/delete/${id}/`)
78-
.then((res) => {
79-
if (res.status === 204) getPosts();
80-
})
81-
.catch((error) => console.error("Error deleting post:", error));
82+
const deletePost = async (id) => {
83+
try {
84+
const response = await api.delete(`/api/notes/delete/${id}/`);
85+
if (response.status === 204) {
86+
getMovieReviews(dailyMovie.imdbID);
87+
}
88+
} catch (error) {
89+
console.error("Error deleting post:", error);
90+
}
8291
};
8392

8493
const editPost = async (id, newContent) => {
8594
try {
8695
const response = await api.put(`/api/notes/${id}/`, {
87-
content: newContent
96+
content: newContent,
97+
movie_imdb_id: dailyMovie.imdbID,
98+
movie_title: dailyMovie.Title
8899
});
89100
if (response.status === 200) {
90-
getPosts();
101+
getMovieReviews(dailyMovie.imdbID);
91102
}
92103
} catch (error) {
93104
console.error("Error editing post:", error);
@@ -99,33 +110,38 @@ const MovieReviews = () => {
99110
const response = await api.post("/api/notes/", {
100111
title: "Reply",
101112
content: content,
102-
parent: parentId
113+
parent: parentId,
114+
movie_imdb_id: dailyMovie.imdbID,
115+
movie_title: dailyMovie.Title
103116
});
104117
if (response.status === 201) {
105-
getPosts();
118+
getMovieReviews(dailyMovie.imdbID);
106119
}
107120
} catch (error) {
108121
console.error("Error replying to post:", error);
109122
}
110123
};
111124

112-
const createPost = (e) => {
125+
const createPost = async (e) => {
113126
e.preventDefault();
114127
if (!postTitle.trim() || !postContent.trim()) {
115128
return;
116129
}
117-
api.post("/api/notes/", {
118-
title: postTitle,
119-
content: postContent
120-
})
121-
.then((res) => {
122-
if (res.status === 201) {
123-
getPosts();
130+
try {
131+
const response = await api.post("/api/notes/", {
132+
title: postTitle,
133+
content: postContent,
134+
movie_imdb_id: dailyMovie.imdbID,
135+
movie_title: dailyMovie.Title
136+
});
137+
if (response.status === 201) {
138+
getMovieReviews(dailyMovie.imdbID);
124139
setPostTitle("");
125140
setPostContent("");
126141
}
127-
})
128-
.catch((error) => console.error("Error creating post:", error));
142+
} catch (error) {
143+
console.error("Error creating post:", error);
144+
}
129145
};
130146

131147
return (
@@ -220,4 +236,4 @@ const MovieReviews = () => {
220236
);
221237
};
222238

223-
export default MovieReviews;
239+
export default Spotlight;

0 commit comments

Comments
 (0)