From a158e649854f39d477183d1d3258fe0b284fa6f4 Mon Sep 17 00:00:00 2001 From: m1ngsama Date: Tue, 9 Dec 2025 16:20:00 +0800 Subject: [PATCH] Implement comment, voting, and user profile features Added controllers for comments, voting system, user profiles, and home page. Includes nested comment support and karma calculation. --- app/Http/Controllers/CommentController.php | 37 +++++++++ app/Http/Controllers/HomeController.php | 19 +++++ app/Http/Controllers/UserController.php | 24 ++++++ app/Http/Controllers/VoteController.php | 93 ++++++++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 app/Http/Controllers/CommentController.php create mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Controllers/UserController.php create mode 100644 app/Http/Controllers/VoteController.php diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php new file mode 100644 index 0000000..6928446 --- /dev/null +++ b/app/Http/Controllers/CommentController.php @@ -0,0 +1,37 @@ +validate([ + 'content' => 'required|string', + 'parent_id' => 'nullable|exists:comments,id', + ]); + + $comment = Comment::create([ + 'post_id' => $post->id, + 'user_id' => auth()->id(), + 'parent_id' => $validated['parent_id'] ?? null, + 'content' => $validated['content'], + ]); + + return back()->with('success', 'Comment posted successfully!'); + } + + public function destroy(Comment $comment) + { + if ($comment->user_id !== auth()->id()) { + abort(403); + } + + $comment->delete(); + return back()->with('success', 'Comment deleted successfully!'); + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php new file mode 100644 index 0000000..660aacb --- /dev/null +++ b/app/Http/Controllers/HomeController.php @@ -0,0 +1,19 @@ +orderBy('votes', 'desc') + ->orderBy('created_at', 'desc') + ->paginate(20); + + return view('home', compact('posts')); + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..7040219 --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,24 @@ +posts() + ->with(['community', 'comments']) + ->orderBy('created_at', 'desc') + ->paginate(20); + + $comments = $user->comments() + ->with(['post', 'post.community']) + ->orderBy('created_at', 'desc') + ->paginate(20); + + return view('users.show', compact('user', 'posts', 'comments')); + } +} diff --git a/app/Http/Controllers/VoteController.php b/app/Http/Controllers/VoteController.php new file mode 100644 index 0000000..3e64589 --- /dev/null +++ b/app/Http/Controllers/VoteController.php @@ -0,0 +1,93 @@ +validate([ + 'vote' => 'required|in:1,-1', + ]); + + $existingVote = Vote::where([ + 'user_id' => auth()->id(), + 'voteable_id' => $post->id, + 'voteable_type' => Post::class, + ])->first(); + + if ($existingVote) { + if ($existingVote->vote == $validated['vote']) { + $existingVote->delete(); + $this->updateVoteCount($post); + return back(); + } + $existingVote->update(['vote' => $validated['vote']]); + } else { + Vote::create([ + 'user_id' => auth()->id(), + 'voteable_id' => $post->id, + 'voteable_type' => Post::class, + 'vote' => $validated['vote'], + ]); + } + + $this->updateVoteCount($post); + $this->updateUserKarma($post->user); + + return back(); + } + + public function voteComment(Request $request, Comment $comment) + { + $validated = $request->validate([ + 'vote' => 'required|in:1,-1', + ]); + + $existingVote = Vote::where([ + 'user_id' => auth()->id(), + 'voteable_id' => $comment->id, + 'voteable_type' => Comment::class, + ])->first(); + + if ($existingVote) { + if ($existingVote->vote == $validated['vote']) { + $existingVote->delete(); + $this->updateVoteCount($comment); + return back(); + } + $existingVote->update(['vote' => $validated['vote']]); + } else { + Vote::create([ + 'user_id' => auth()->id(), + 'voteable_id' => $comment->id, + 'voteable_type' => Comment::class, + 'vote' => $validated['vote'], + ]); + } + + $this->updateVoteCount($comment); + $this->updateUserKarma($comment->user); + + return back(); + } + + private function updateVoteCount($model) + { + $model->votes = $model->votes()->sum('vote'); + $model->save(); + } + + private function updateUserKarma($user) + { + $postKarma = $user->posts()->sum('votes'); + $commentKarma = $user->comments()->sum('votes'); + $user->karma = $postKarma + $commentKarma; + $user->save(); + } +}