middleware('auth'); View::share('is_admin', true); } public function applyBulkAction(Request $request) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $commentIDs = $request->get('comment_ids'); if (is_null($commentIDs) || !is_array($commentIDs) || count($commentIDs) == 0) { $request->session()->flash('warning', trans('admin.no_comments_selected_message')); return redirect(route('comments.index')); } $comments = PhotoComment::whereIn('id', $commentIDs)->get(); $commentsActioned = 0; if ($request->has('bulk_delete')) { /** @var PhotoComment $comment */ foreach ($comments as $comment) { $comment->delete(); $commentsActioned++; } $request->session()->flash('success', trans_choice('admin.bulk_comments_deleted', $commentsActioned, ['number' => $commentsActioned])); } else if ($request->has('bulk_approve')) { /** @var PhotoComment $comment */ foreach ($comments as $comment) { if ($comment->isApproved()) { // Don't make changes if already approved continue; } // Mark as approved $comment->approved_at = new \DateTime(); $comment->approved_user_id = $this->getUser()->id; // The comment may have already been rejected - remove the data if so $comment->rejected_at = null; $comment->rejected_user_id = null; // Send the notification e-mail to the owner $comment->save(); $commentsActioned++; // Send e-mail notification $photo = $comment->photo; $album = $photo->album; $this->notifyAlbumOwnerAndPoster($album, $photo, $comment); } $request->session()->flash('success', trans_choice('admin.bulk_comments_approved', $commentsActioned, ['number' => $commentsActioned])); } else if ($request->has('bulk_reject')) { /** @var PhotoComment $comment */ foreach ($comments as $comment) { if ($comment->isRejected()) { // Don't make changes if already rejected continue; } // Mark as rejected $comment->rejected_at = new \DateTime(); $comment->rejected_user_id = $this->getUser()->id; // The comment may have already been approved - remove the data if so $comment->approved_at = null; $comment->approved_user_id = null; $comment->save(); $commentsActioned++; } $request->session()->flash('success', trans_choice('admin.bulk_comments_approved', $commentsActioned, ['number' => $commentsActioned])); } return redirect(route('comments.index')); } public function approve($id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $comment = $this->loadCommentByID($id); return Theme::render('admin.approve_comment', ['comment' => $comment]); } public function bulkAction(Request $request) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $commentIDs = $request->get('comment_ids'); if (is_null($commentIDs) || !is_array($commentIDs) || count($commentIDs) == 0) { $request->session()->flash('warning', trans('admin.no_comments_selected_message')); return redirect(route('comments.index')); } if ($request->has('bulk_delete')) { if (count($commentIDs) == 1) { // Single comment selected - redirect to the single delete page return redirect(route('comments.delete', ['id' => $commentIDs[0]])); } // Show the view to confirm the delete return Theme::render('admin.bulk_delete_comments', [ 'comment_count' => count($commentIDs), 'comment_ids' => $commentIDs ]); } else if ($request->has('bulk_approve')) { if (count($commentIDs) == 1) { // Single comment selected - redirect to the single approve page return redirect(route('comments.approve', ['id' => $commentIDs[0]])); } // Show the view to confirm the approval return Theme::render('admin.bulk_approve_comments', [ 'comment_count' => count($commentIDs), 'comment_ids' => $commentIDs ]); } else if ($request->has('bulk_reject')) { if (count($commentIDs) == 1) { // Single comment selected - redirect to the single reject page return redirect(route('comments.reject', ['id' => $commentIDs[0]])); } // Show the view to confirm the rejection return Theme::render('admin.bulk_reject_comments', [ 'comment_count' => count($commentIDs), 'comment_ids' => $commentIDs ]); } // Unrecognised action - simply redirect back to the index page return redirect(route('comments.index')); } public function confirmApprove(Request $request, $id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $comment = $this->loadCommentByID($id); if ($comment->isApproved()) { // Comment has already been approved return redirect(route('comments.index')); } // Mark as approved $comment->approved_at = new \DateTime(); $comment->approved_user_id = $this->getUser()->id; // The comment may have already been rejected - remove the data if so $comment->rejected_at = null; $comment->rejected_user_id = null; $comment->save(); $request->session()->flash('success', trans('admin.comment_approval_successful', [ 'author_name' => $comment->authorDisplayName() ])); // Send e-mail notification $photo = $comment->photo; $album = $photo->album; $this->notifyAlbumOwnerAndPoster($album, $photo, $comment); return redirect(route('comments.index')); } public function confirmReject(Request $request, $id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $comment = $this->loadCommentByID($id); if ($comment->isRejected()) { // Comment has already been rejected return redirect(route('comments.index')); } // Mark as rejected $comment->rejected_at = new \DateTime(); $comment->rejected_user_id = $this->getUser()->id; // The comment may have already been approved - remove the data if so $comment->approved_at = null; $comment->approved_user_id = null; $comment->save(); $request->session()->flash('success', trans('admin.comment_rejection_successful', [ 'author_name' => $comment->authorDisplayName() ])); return redirect(route('comments.index')); } public function delete($id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $comment = $this->loadCommentByID($id); return Theme::render('admin.delete_comment', ['comment' => $comment]); } public function destroy(Request $request, $id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); /** @var PhotoComment $comment */ $comment = $this->loadCommentByID($id); $comment->delete(); $request->session()->flash('success', trans('admin.comment_deletion_successful', [ 'author_name' => $comment->authorDisplayName() ])); return redirect(route('comments.index')); } public function index(Request $request) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $validStatusList = [ 'all', 'pending', 'approved', 'rejected' ]; $filterStatus = $request->get('status', 'all'); if (!in_array($filterStatus, $validStatusList)) { $filterStatus = $validStatusList[0]; } $comments = PhotoComment::with('photo') ->with('photo.album') ->orderBy('created_at', 'desc'); switch (strtolower($filterStatus)) { case 'approved': $comments->whereNotNull('approved_at') ->whereNull('rejected_at'); break; case 'pending': $comments->whereNull('approved_at') ->whereNull('rejected_at'); break; case 'rejected': $comments->whereNull('approved_at') ->whereNotNull('rejected_at'); break; } return Theme::render('admin.list_comments', [ 'comments' => $comments->paginate(UserConfig::get('items_per_page')), 'filter_status' => $filterStatus, 'success' => $request->session()->get('success'), 'warning' => $request->session()->get('warning') ]); } public function reject($id) { $this->authorizeAccessToAdminPanel('admin:manage-comments'); $comment = $this->loadCommentByID($id); return Theme::render('admin.reject_comment', ['comment' => $comment]); } /** * Loads a given comment by its ID. * @param $id * @return PhotoComment */ private function loadCommentByID($id) { $comment = PhotoComment::where('id', intval($id))->first(); if (is_null($comment)) { App::abort(404); } return $comment; } /** * Sends an e-mail notification to an album's owned that a comment has been posted/approved. * @param Album $album * @param Photo $photo * @param PhotoComment $comment */ private function notifyAlbumOwnerAndPoster(Album $album, Photo $photo, PhotoComment $comment) { /** @var User $owner */ $owner = $album->user; $owner->notify(new PhotoCommentApproved($album, $photo, $comment)); // Also send a notification to the comment poster $poster = new User(); $poster->name = $comment->authorDisplayName(); $poster->email = $comment->authorEmail(); $poster->notify(new PhotoCommentApprovedUser($album, $photo, $comment)); // Send notification to the parent comment owner (if this is a reply) if (!is_null($comment->parent_comment_id)) { $parentComment = $this->loadCommentByID($comment->parent_comment_id); if (is_null($parentComment)) { return; } $parentPoster = new User(); $parentPoster->name = $parentComment->authorDisplayName(); $parentPoster->email = $parentComment->authorEmail(); $parentPoster->notify(new PhotoCommentRepliedTo($album, $photo, $comment)); } } }