Merge photo comments feature #114
@ -2,11 +2,18 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Album;
|
||||||
use App\Facade\Theme;
|
use App\Facade\Theme;
|
||||||
use App\Facade\UserConfig;
|
use App\Facade\UserConfig;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Mail\PhotoCommentApproved;
|
||||||
|
use App\Mail\PhotoCommentApprovedUser;
|
||||||
|
use App\Mail\PhotoCommentRepliedTo;
|
||||||
|
use App\Photo;
|
||||||
use App\PhotoComment;
|
use App\PhotoComment;
|
||||||
|
use App\User;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Mail;
|
||||||
use Illuminate\Support\Facades\View;
|
use Illuminate\Support\Facades\View;
|
||||||
|
|
||||||
class PhotoCommentController extends Controller
|
class PhotoCommentController extends Controller
|
||||||
@ -47,6 +54,12 @@ class PhotoCommentController extends Controller
|
|||||||
/** @var PhotoComment $comment */
|
/** @var PhotoComment $comment */
|
||||||
foreach ($comments as $comment)
|
foreach ($comments as $comment)
|
||||||
{
|
{
|
||||||
|
if ($comment->isApproved())
|
||||||
|
{
|
||||||
|
// Don't make changes if already approved
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Mark as approved
|
// Mark as approved
|
||||||
$comment->approved_at = new \DateTime();
|
$comment->approved_at = new \DateTime();
|
||||||
$comment->approved_user_id = $this->getUser()->id;
|
$comment->approved_user_id = $this->getUser()->id;
|
||||||
@ -55,8 +68,15 @@ class PhotoCommentController extends Controller
|
|||||||
$comment->rejected_at = null;
|
$comment->rejected_at = null;
|
||||||
$comment->rejected_user_id = null;
|
$comment->rejected_user_id = null;
|
||||||
|
|
||||||
|
// Send the notification e-mail to the owner
|
||||||
|
|
||||||
$comment->save();
|
$comment->save();
|
||||||
$commentsActioned++;
|
$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]));
|
$request->session()->flash('success', trans_choice('admin.bulk_comments_approved', $commentsActioned, ['number' => $commentsActioned]));
|
||||||
@ -66,6 +86,12 @@ class PhotoCommentController extends Controller
|
|||||||
/** @var PhotoComment $comment */
|
/** @var PhotoComment $comment */
|
||||||
foreach ($comments as $comment)
|
foreach ($comments as $comment)
|
||||||
{
|
{
|
||||||
|
if ($comment->isRejected())
|
||||||
|
{
|
||||||
|
// Don't make changes if already rejected
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Mark as rejected
|
// Mark as rejected
|
||||||
$comment->rejected_at = new \DateTime();
|
$comment->rejected_at = new \DateTime();
|
||||||
$comment->rejected_user_id = $this->getUser()->id;
|
$comment->rejected_user_id = $this->getUser()->id;
|
||||||
@ -157,6 +183,12 @@ class PhotoCommentController extends Controller
|
|||||||
|
|
||||||
$comment = $this->loadCommentByID($id);
|
$comment = $this->loadCommentByID($id);
|
||||||
|
|
||||||
|
if ($comment->isApproved())
|
||||||
|
{
|
||||||
|
// Comment has already been approved
|
||||||
|
return redirect(route('comments.index'));
|
||||||
|
}
|
||||||
|
|
||||||
// Mark as approved
|
// Mark as approved
|
||||||
$comment->approved_at = new \DateTime();
|
$comment->approved_at = new \DateTime();
|
||||||
$comment->approved_user_id = $this->getUser()->id;
|
$comment->approved_user_id = $this->getUser()->id;
|
||||||
@ -171,6 +203,11 @@ class PhotoCommentController extends Controller
|
|||||||
'author_name' => $comment->authorDisplayName()
|
'author_name' => $comment->authorDisplayName()
|
||||||
]));
|
]));
|
||||||
|
|
||||||
|
// Send e-mail notification
|
||||||
|
$photo = $comment->photo;
|
||||||
|
$album = $photo->album;
|
||||||
|
$this->notifyAlbumOwnerAndPoster($album, $photo, $comment);
|
||||||
|
|
||||||
return redirect(route('comments.index'));
|
return redirect(route('comments.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +217,12 @@ class PhotoCommentController extends Controller
|
|||||||
|
|
||||||
$comment = $this->loadCommentByID($id);
|
$comment = $this->loadCommentByID($id);
|
||||||
|
|
||||||
|
if ($comment->isRejected())
|
||||||
|
{
|
||||||
|
// Comment has already been rejected
|
||||||
|
return redirect(route('comments.index'));
|
||||||
|
}
|
||||||
|
|
||||||
// Mark as rejected
|
// Mark as rejected
|
||||||
$comment->rejected_at = new \DateTime();
|
$comment->rejected_at = new \DateTime();
|
||||||
$comment->rejected_user_id = $this->getUser()->id;
|
$comment->rejected_user_id = $this->getUser()->id;
|
||||||
@ -292,4 +335,41 @@ class PhotoCommentController extends Controller
|
|||||||
|
|
||||||
return $comment;
|
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)
|
||||||
|
{
|
||||||
|
$owner = $album->user;
|
||||||
|
|
||||||
|
Mail::to($owner)->send(new PhotoCommentApproved($owner, $album, $photo, $comment));
|
||||||
|
|
||||||
|
// Also send a notification to the comment poster
|
||||||
|
$poster = new User();
|
||||||
|
$poster->name = $comment->authorDisplayName();
|
||||||
|
$poster->email = $comment->authorEmail();
|
||||||
|
|
||||||
|
Mail::to($poster)->send(new PhotoCommentApprovedUser($poster, $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();
|
||||||
|
|
||||||
|
Mail::to($parentPoster)->send(new PhotoCommentRepliedTo($parentPoster, $album, $photo, $comment));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -54,7 +54,7 @@ class PhotoCommentController extends Controller
|
|||||||
$comment->approved_user_id = $this->getUser()->id;
|
$comment->approved_user_id = $this->getUser()->id;
|
||||||
$comment->save();
|
$comment->save();
|
||||||
|
|
||||||
$this->notifyAlbumOwner($album, $photo, $comment);
|
$this->notifyAlbumOwnerAndPoster($album, $photo, $comment);
|
||||||
$request->getSession()->flash('success', trans('gallery.photo_comment_approved_successfully'));
|
$request->getSession()->flash('success', trans('gallery.photo_comment_approved_successfully'));
|
||||||
}
|
}
|
||||||
else if ($request->has('reject'))
|
else if ($request->has('reject'))
|
||||||
@ -191,7 +191,7 @@ class PhotoCommentController extends Controller
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->notifyAlbumOwner($album, $photo, $comment);
|
$this->notifyAlbumOwnerAndPoster($album, $photo, $comment);
|
||||||
$request->getSession()->flash('success', trans('gallery.photo_comment_posted_successfully'));
|
$request->getSession()->flash('success', trans('gallery.photo_comment_posted_successfully'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,16 +281,35 @@ class PhotoCommentController extends Controller
|
|||||||
* @param Photo $photo
|
* @param Photo $photo
|
||||||
* @param PhotoComment $comment
|
* @param PhotoComment $comment
|
||||||
*/
|
*/
|
||||||
private function notifyAlbumOwner(Album $album, Photo $photo, PhotoComment $comment)
|
private function notifyAlbumOwnerAndPoster(Album $album, Photo $photo, PhotoComment $comment)
|
||||||
{
|
{
|
||||||
$owner = $album->user;
|
$owner = $album->user;
|
||||||
|
|
||||||
|
Mail::to($owner)->send(new PhotoCommentApproved($owner, $album, $photo, $comment));
|
||||||
|
|
||||||
|
// Also send a notification to the comment poster
|
||||||
$poster = new User();
|
$poster = new User();
|
||||||
$poster->name = $comment->authorDisplayName();
|
$poster->name = $comment->authorDisplayName();
|
||||||
$poster->email = $comment->authorEmail();
|
$poster->email = $comment->authorEmail();
|
||||||
|
|
||||||
Mail::to($owner)->send(new PhotoCommentApproved($owner, $album, $photo, $comment));
|
|
||||||
Mail::to($poster)->send(new PhotoCommentApprovedUser($poster, $album, $photo, $comment));
|
Mail::to($poster)->send(new PhotoCommentApprovedUser($poster, $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();
|
||||||
|
|
||||||
|
Mail::to($parentPoster)->send(new PhotoCommentRepliedTo($parentPoster, $album, $photo, $comment));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function stripDisallowedHtmlTags($commentText)
|
private function stripDisallowedHtmlTags($commentText)
|
||||||
|
60
app/Mail/PhotoCommentRepliedTo.php
Normal file
60
app/Mail/PhotoCommentRepliedTo.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Mail;
|
||||||
|
|
||||||
|
use App\Album;
|
||||||
|
use App\Facade\Theme;
|
||||||
|
use App\Photo;
|
||||||
|
use App\PhotoComment;
|
||||||
|
use App\User;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Mail\Mailable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* E-mail notification to the poster of a comment that is sent when it has been approved.
|
||||||
|
* @package App\Mail
|
||||||
|
*/
|
||||||
|
class PhotoCommentRepliedTo extends Mailable
|
||||||
|
{
|
||||||
|
use Queueable, SerializesModels;
|
||||||
|
|
||||||
|
private $album;
|
||||||
|
private $comment;
|
||||||
|
private $photo;
|
||||||
|
private $user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new message instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(User $user, Album $album, Photo $photo, PhotoComment $comment)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
$this->album = $album;
|
||||||
|
$this->photo = $photo;
|
||||||
|
$this->comment = $comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the message.
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function build()
|
||||||
|
{
|
||||||
|
$subject = trans('email.photo_comment_replied_to_subject', ['album_name' => $this->album->name]);
|
||||||
|
|
||||||
|
return $this
|
||||||
|
->subject($subject)
|
||||||
|
->markdown(Theme::viewName('email.photo_comment_replied_to'))
|
||||||
|
->with([
|
||||||
|
'album' => $this->album,
|
||||||
|
'comment' => $this->comment,
|
||||||
|
'photo' => $this->photo,
|
||||||
|
'subject' => $subject,
|
||||||
|
'user' => $this->user
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -25,5 +25,9 @@ return [
|
|||||||
'photo_comment_approved_user_comment_label' => 'Comments:',
|
'photo_comment_approved_user_comment_label' => 'Comments:',
|
||||||
'photo_comment_approved_user_p1' => 'Your comment has been successfully posted in the :album_name album.',
|
'photo_comment_approved_user_p1' => 'Your comment has been successfully posted in the :album_name album.',
|
||||||
'photo_comment_approved_user_p2' => 'Click the button below to view the photo\'s page to see your comment.',
|
'photo_comment_approved_user_p2' => 'Click the button below to view the photo\'s page to see your comment.',
|
||||||
'photo_comment_approved_user_subject' => 'Your comment was posted in :album_name'
|
'photo_comment_approved_user_subject' => 'Your comment was posted in :album_name',
|
||||||
|
'photo_comment_replied_to_comment_label' => 'Comments:',
|
||||||
|
'photo_comment_replied_to_p1' => 'A reply to your comment has been posted in the :album_name album.',
|
||||||
|
'photo_comment_replied_to_p2' => 'Click the button below to view the photo\'s page to see the reply to your comment.',
|
||||||
|
'photo_comment_replied_to_subject' => 'A reply to your comment was posted in :album_name'
|
||||||
];
|
];
|
@ -40,6 +40,7 @@ return [
|
|||||||
'parent_album_placeholder' => 'None (top-level album)',
|
'parent_album_placeholder' => 'None (top-level album)',
|
||||||
'password_label' => 'Password:',
|
'password_label' => 'Password:',
|
||||||
'password_confirm_label' => 'Confirm password:',
|
'password_confirm_label' => 'Confirm password:',
|
||||||
|
'photo_comment_email_help' => 'We\'ll only use this to send you notifications about your comment. It won\'t be published.',
|
||||||
'photo_comment_reply_action' => 'Post reply',
|
'photo_comment_reply_action' => 'Post reply',
|
||||||
'photo_comment_submit_action' => 'Post comment',
|
'photo_comment_submit_action' => 'Post comment',
|
||||||
'photo_comment_text_label' => 'Your message/comments:',
|
'photo_comment_text_label' => 'Your message/comments:',
|
||||||
|
@ -45,7 +45,8 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p>
|
<p>
|
||||||
<a href="{{ route('comments.edit', ['id' => $comment->id]) }}"><span style="font-size: 1.3em;">{{ $comment->name }}</span></a>
|
{{-- TODO: edit comments <a href="{{ route('comments.edit', ['id' => $comment->id]) }}"><span style="font-size: 1.3em;">{{ $comment->name }}</span></a> --}}
|
||||||
|
<span style="font-size: 1.3em;">{{ $comment->name }}</span>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
<span class="text-muted" style="font-size: smaller;">{{ trans('admin.comment_summary', ['album_name' => $comment->photo->album->name, 'photo_name' => $comment->photo->name, 'comment_date' => date(UserConfig::get('date_format'), strtotime($comment->created_at))]) }}</span>
|
<span class="text-muted" style="font-size: smaller;">{{ trans('admin.comment_summary', ['album_name' => $comment->photo->album->name, 'photo_name' => $comment->photo->name, 'comment_date' => date(UserConfig::get('date_format'), strtotime($comment->created_at))]) }}</span>
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
@component('mail::message')
|
||||||
|
@lang('email.generic_intro', ['user_name' => $user->name])
|
||||||
|
|
||||||
|
|
||||||
|
@lang('email.photo_comment_replied_to_p1', ['album_name' => $album->name])
|
||||||
|
|
||||||
|
|
||||||
|
@lang('email.photo_comment_replied_to_p2')
|
||||||
|
|
||||||
|
|
||||||
|
@lang('email.photo_comment_replied_to_comment_label')
|
||||||
|
|
||||||
|
{!! $comment->comment !!}
|
||||||
|
|
||||||
|
@component('mail::button', ['url' => $photo->url(), 'color' => 'blue'])
|
||||||
|
@lang('forms.view_photo_comment_action')
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
@lang('email.generic_regards')<br/>
|
||||||
|
{{ UserConfig::get('app_name') }}<br/>
|
||||||
|
<a href="{{ route('home') }}">{{ route('home') }}</a>
|
||||||
|
@endcomponent
|
@ -3,7 +3,7 @@ $is_reply = isset($reply_comment);
|
|||||||
$is_known_user = !is_null(Auth::user())
|
$is_known_user = !is_null(Auth::user())
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
{{-- Show a previous of the comment we're replying to --}}
|
{{-- Show a preview of the comment we're replying to --}}
|
||||||
@if ($is_reply)
|
@if ($is_reply)
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
@include (Theme::viewName('partials.photo_single_comment'), ['comment' => $reply_comment, 'is_reply' => true])
|
@include (Theme::viewName('partials.photo_single_comment'), ['comment' => $reply_comment, 'is_reply' => true])
|
||||||
@ -31,6 +31,7 @@ $is_known_user = !is_null(Auth::user())
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="commentor-email">@lang('forms.email_label')</label>
|
<label for="commentor-email">@lang('forms.email_label')</label>
|
||||||
<input type="text" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" id="commentor-email" name="email" value="{{ old('email', ($is_known_user ? Auth::user()->email : '')) }}" placeholder="@lang('forms.email_placeholder')"{{ $is_known_user ? ' readonly="readonly"' : '' }}//>
|
<input type="text" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" id="commentor-email" name="email" value="{{ old('email', ($is_known_user ? Auth::user()->email : '')) }}" placeholder="@lang('forms.email_placeholder')"{{ $is_known_user ? ' readonly="readonly"' : '' }}//>
|
||||||
|
<small class="form-text text-muted">@lang('forms.photo_comment_email_help')</small>
|
||||||
|
|
||||||
@if ($errors->has('email'))
|
@if ($errors->has('email'))
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
|
Loading…
Reference in New Issue
Block a user