mirror of
https://github.com/astuto/astuto.git
synced 2025-12-16 11:47:56 +01:00
Add New Comment on your post notifications
This notification is sent only to the post owner, unless this person turned off the notifications. A simple first step into the notifications by mail world :) The mail contains a link to user profile The link to the user profile is required to give an easy access to notifications disabling. Also having a preview for the notify_post_owner method We can `Comment.first` because it is part of the db:seeds method. So there should, in development, always be one.
This commit is contained in:
committed by
Riccardo Graziosi
parent
9dfb13eff6
commit
007d08a051
@@ -30,6 +30,7 @@ It has been heavely inspired by [Canny.io](https://canny.io/) ("astuto", indeed,
|
|||||||
* Boards, to divide different types of feedback
|
* Boards, to divide different types of feedback
|
||||||
* Roadmap, to let your users know what you're working on
|
* Roadmap, to let your users know what you're working on
|
||||||
* Comments, to discuss with your customers
|
* Comments, to discuss with your customers
|
||||||
|
* Notifications, to inform post owner of comments
|
||||||
* Feedback labels, to inform about the state of a certain feedback
|
* Feedback labels, to inform about the state of a certain feedback
|
||||||
* Feedback updates, to notify your users with news regarding a certain feedback
|
* Feedback updates, to notify your users with news regarding a certain feedback
|
||||||
* Completely customizable (i.e. you can add/edit/remove as many boards, feedback statuses as you want; you can configure the roadmap the way you want; etc.)
|
* Completely customizable (i.e. you can add/edit/remove as many boards, feedback statuses as you want; you can configure the roadmap the way you want; etc.)
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ class CommentsController < ApplicationController
|
|||||||
comment = Comment.new(comment_params)
|
comment = Comment.new(comment_params)
|
||||||
|
|
||||||
if comment.save
|
if comment.save
|
||||||
|
send_notifications(comment)
|
||||||
|
|
||||||
render json: comment.attributes.merge(
|
render json: comment.attributes.merge(
|
||||||
{ user_full_name: current_user.full_name, user_email: current_user.email}
|
{ user_full_name: current_user.full_name, user_email: current_user.email}
|
||||||
), status: :created
|
), status: :created
|
||||||
@@ -55,14 +57,19 @@ class CommentsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
def comment_params
|
||||||
|
params
|
||||||
|
.require(:comment)
|
||||||
|
.permit(:body, :parent_id, :is_post_update)
|
||||||
|
.merge(
|
||||||
|
user_id: current_user.id,
|
||||||
|
post_id: params[:post_id]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def comment_params
|
def send_notifications(comment)
|
||||||
params
|
if comment.post.user.notifications_enabled?
|
||||||
.require(:comment)
|
UserMailer.notify_post_owner(comment: comment).deliver_later
|
||||||
.permit(:body, :parent_id, :is_post_update)
|
|
||||||
.merge(
|
|
||||||
user_id: current_user.id,
|
|
||||||
post_id: params[:post_id]
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
10
app/mailers/user_mailer.rb
Normal file
10
app/mailers/user_mailer.rb
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
class UserMailer < ApplicationMailer
|
||||||
|
default from: "notifications@example.com"
|
||||||
|
|
||||||
|
def notify_post_owner(comment:)
|
||||||
|
@comment = comment
|
||||||
|
@user = comment.post.user
|
||||||
|
|
||||||
|
mail(to: @user.email, subject: "[#{ENV.fetch('APP_NAME')}] - New comment on #{comment.post.title}")
|
||||||
|
end
|
||||||
|
end
|
||||||
17
app/views/user_mailer/notify_post_owner.html.erb
Normal file
17
app/views/user_mailer/notify_post_owner.html.erb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello, <%= @user.full_name %></h1>
|
||||||
|
<p>
|
||||||
|
There is a new comment by <%= @comment.user.full_name %> on your post <b><%= @comment.post.title %></b>
|
||||||
|
</p>
|
||||||
|
<p> To see this comment, <%= link_to "Click here", post_url(@comment.post) %> </p>
|
||||||
|
<p>Have a great day!</p>
|
||||||
|
</body>
|
||||||
|
<footer>
|
||||||
|
Annoyed ? You can <%= link_to("turn off notifications here", edit_user_registration_url) %>
|
||||||
|
</footer>
|
||||||
|
</html>
|
||||||
@@ -9,7 +9,6 @@ ENV["POSTS_PER_PAGE"] = "15"
|
|||||||
|
|
||||||
Rails.application.configure do
|
Rails.application.configure do
|
||||||
# Settings specified here will take precedence over those in config/application.rb.
|
# Settings specified here will take precedence over those in config/application.rb.
|
||||||
|
|
||||||
# For Devise
|
# For Devise
|
||||||
config.action_mailer.default_url_options = { host: 'localhost:3000' }
|
config.action_mailer.default_url_options = { host: 'localhost:3000' }
|
||||||
|
|
||||||
@@ -46,6 +45,7 @@ Rails.application.configure do
|
|||||||
# The :test delivery method accumulates sent emails in the
|
# The :test delivery method accumulates sent emails in the
|
||||||
# ActionMailer::Base.deliveries array.
|
# ActionMailer::Base.deliveries array.
|
||||||
config.action_mailer.delivery_method = :test
|
config.action_mailer.delivery_method = :test
|
||||||
|
config.active_job.queue_adapter = :test
|
||||||
|
|
||||||
# Print deprecation notices to the stderr.
|
# Print deprecation notices to the stderr.
|
||||||
config.active_support.deprecation = :stderr
|
config.active_support.deprecation = :stderr
|
||||||
|
|||||||
6
spec/mailers/previews/user_mailer_preview.rb
Normal file
6
spec/mailers/previews/user_mailer_preview.rb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Preview all emails at http://localhost:3000/rails/mailers/user_mailer
|
||||||
|
class UserMailerPreview < ActionMailer::Preview
|
||||||
|
def notify_post_owner
|
||||||
|
UserMailer.notify_post_owner(comment: Comment.first)
|
||||||
|
end
|
||||||
|
end
|
||||||
22
spec/mailers/user_mailer_spec.rb
Normal file
22
spec/mailers/user_mailer_spec.rb
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
RSpec.describe UserMailer, type: :mailer do
|
||||||
|
describe "notify_comment" do
|
||||||
|
let(:user) { FactoryBot.create(:user, email: "notified@example.com", notifications_enabled: true) }
|
||||||
|
let(:post) { FactoryBot.create(:post, user: user)}
|
||||||
|
let(:comment) { FactoryBot.create(:comment, post: post) }
|
||||||
|
let(:mail) { UserMailer.notify_post_owner(comment: comment) }
|
||||||
|
|
||||||
|
it "renders the headers" do
|
||||||
|
expect(mail.subject).to eq("[#{ENV.fetch('APP_NAME')}] - New comment on #{post.title}")
|
||||||
|
expect(mail.to).to eq(["notified@example.com"])
|
||||||
|
expect(mail.from).to eq(["notifications@example.com"])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "renders the body" do
|
||||||
|
expect(mail.body.encoded).to include("Hello, #{user.full_name}")
|
||||||
|
expect(mail.body.encoded).to include("There is a new comment by")
|
||||||
|
expect(mail.body.encoded).to include('Annoyed ? You can <a href="http://localhost:3000/users/edit">turn off notifications here</a>')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
5
spec/support/action_mailer.rb
Normal file
5
spec/support/action_mailer.rb
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
RSpec.configure do |config|
|
||||||
|
config.before(:each) do
|
||||||
|
ActionMailer::Base.deliveries.clear
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -108,4 +108,34 @@ feature 'comments', type: :system, js: true do
|
|||||||
|
|
||||||
expect(Comment.where(post_id: post.id).count).to eq(comments_count + 1)
|
expect(Comment.where(post_id: post.id).count).to eq(comments_count + 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'notifies post owner when comment is posted' do
|
||||||
|
log_in_as user
|
||||||
|
visit post_path(post)
|
||||||
|
allow(UserMailer).to receive_message_chain(:notify_post_owner, :deliver_later)
|
||||||
|
|
||||||
|
comment_body = 'this is a comment!'
|
||||||
|
|
||||||
|
find(newCommentBodySelector).fill_in with: comment_body
|
||||||
|
click_button 'Submit'
|
||||||
|
visit post_path(post)
|
||||||
|
|
||||||
|
expect(UserMailer).to have_received(:notify_post_owner)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not notify the post owner if he refused notifications' do
|
||||||
|
post_owner = FactoryBot.create(:user, notifications_enabled: false)
|
||||||
|
post = FactoryBot.create(:post, user: post_owner)
|
||||||
|
log_in_as user
|
||||||
|
visit post_path(post)
|
||||||
|
allow(UserMailer).to receive_message_chain(:notify_post_owner, :deliver_later)
|
||||||
|
|
||||||
|
comment_body = 'this is a comment!'
|
||||||
|
|
||||||
|
find(newCommentBodySelector).fill_in with: comment_body
|
||||||
|
click_button 'Submit'
|
||||||
|
visit post_path(post)
|
||||||
|
|
||||||
|
expect(UserMailer).not_to have_received(:notify_post_owner)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -77,7 +77,7 @@ feature 'sign up', type: :system do
|
|||||||
expect(page).to have_css('.alert')
|
expect(page).to have_css('.alert')
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'and disables notifications' do
|
scenario 'with disabled notifications' do
|
||||||
visit new_user_registration_path
|
visit new_user_registration_path
|
||||||
fill_in 'Full name', with: user.full_name
|
fill_in 'Full name', with: user.full_name
|
||||||
fill_in 'Email', with: user.email
|
fill_in 'Email', with: user.email
|
||||||
|
|||||||
Reference in New Issue
Block a user