- Installed p7h/nas-file-manager package via private VCS repo - Published config/nas-file-manager.php with super_admin middleware restriction - Added NAS env vars to .env.example - Created admin/nas-storage page with connection info panel and file browser widget - Added NAS Storage link to admin sidebar (super_admin only) - Added SuperAdminController@nasStorage method and admin.nas-storage route - Includes all accumulated branch changes: profile wall, 2FA, audit logs, settings panel, country/phone/timezone components, posts, slideshow, playlist shares, video downloads/shares, comment likes, notifications, social links, and more Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
122 lines
3.6 KiB
PHP
122 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Comment;
|
|
use App\Models\CommentLike;
|
|
use App\Models\Video;
|
|
use App\Notifications\NewCommentLikeNotification;
|
|
use App\Notifications\NewCommentNotification;
|
|
use App\Notifications\NewReplyNotification;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class CommentController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth')->except(['index']);
|
|
}
|
|
|
|
public function index(Video $video)
|
|
{
|
|
$comments = $video->comments()->whereNull('parent_id')->with(['user', 'replies.user'])->get();
|
|
|
|
return response()->json($comments);
|
|
}
|
|
|
|
public function store(Request $request, Video $video)
|
|
{
|
|
$request->validate([
|
|
'body' => 'required|string|max:1000',
|
|
'parent_id' => 'nullable|exists:comments,id',
|
|
]);
|
|
|
|
$commenter = Auth::user();
|
|
|
|
$comment = $video->comments()->create([
|
|
'user_id' => $commenter->id,
|
|
'body' => $request->body,
|
|
'parent_id' => $request->parent_id,
|
|
]);
|
|
|
|
$comment->load('user:id,name,avatar');
|
|
|
|
// Fire notifications (never notify yourself)
|
|
if ($request->parent_id) {
|
|
// Reply — notify the parent comment's author
|
|
$parent = Comment::find($request->parent_id);
|
|
if ($parent && $parent->user_id !== $commenter->id) {
|
|
$parent->user->notify(new NewReplyNotification($video, $comment, $commenter));
|
|
}
|
|
} else {
|
|
// Top-level comment — notify the video owner
|
|
if ($video->user_id !== $commenter->id) {
|
|
$video->user->notify(new NewCommentNotification($video, $comment, $commenter));
|
|
}
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'comment' => $comment->load('user:id,name,avatar'),
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, Comment $comment)
|
|
{
|
|
if ($comment->user_id !== Auth::id()) {
|
|
return response()->json(['error' => 'Unauthorized'], 403);
|
|
}
|
|
|
|
$request->validate([
|
|
'body' => 'required|string|max:1000',
|
|
]);
|
|
|
|
$comment->update(['body' => $request->body]);
|
|
$comment->load('user:id,name,avatar');
|
|
|
|
return response()->json($comment->load('user:id,name,avatar'));
|
|
}
|
|
|
|
public function destroy(Comment $comment)
|
|
{
|
|
if ($comment->user_id !== Auth::id()) {
|
|
return response()->json(['error' => 'Unauthorized'], 403);
|
|
}
|
|
|
|
$comment->delete();
|
|
|
|
return response()->json(['success' => true]);
|
|
}
|
|
|
|
public function like(Comment $comment)
|
|
{
|
|
$userId = Auth::id();
|
|
$existing = CommentLike::where('comment_id', $comment->id)
|
|
->where('user_id', $userId)
|
|
->first();
|
|
|
|
if ($existing) {
|
|
$existing->delete();
|
|
$liked = false;
|
|
} else {
|
|
CommentLike::create(['comment_id' => $comment->id, 'user_id' => $userId]);
|
|
$liked = true;
|
|
|
|
// Notify the comment author (not self-likes)
|
|
if ($comment->user_id !== $userId) {
|
|
$video = $comment->video;
|
|
if ($video) {
|
|
$comment->user->notify(
|
|
new NewCommentLikeNotification($video, $comment, Auth::user())
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$count = CommentLike::where('comment_id', $comment->id)->count();
|
|
|
|
return response()->json(['liked' => $liked, 'count' => $count]);
|
|
}
|
|
}
|