FEATURE: Send an email notification when a post is approved. (#12665)

We now send an email when a queued post is approved, and we create a notification.
This commit is contained in:
Roman Rizzi 2021-04-12 12:08:23 -03:00 committed by GitHub
parent 045adb76f2
commit 958fbfb719
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 51 additions and 3 deletions

View File

@ -37,6 +37,20 @@ class UserNotifications < ActionMailer::Base
new_user_tips: tips) new_user_tips: tips)
end end
def post_approved(user, opts = {})
post_url = opts.dig(:notification_data_hash, :post_url)
return if post_url.nil?
locale = user_locale(user)
build_email(user.email,
template: 'user_notifications.post_approved',
locale: locale,
base_url: Discourse.base_url,
post_url: post_url
)
end
def signup_after_reject(user, opts = {}) def signup_after_reject(user, opts = {})
locale = user_locale(user) locale = user_locale(user)
build_email(user.email, build_email(user.email,

View File

@ -97,7 +97,7 @@ class ReviewableQueuedPost < Reviewable
Notification.create!( Notification.create!(
notification_type: Notification.types[:post_approved], notification_type: Notification.types[:post_approved],
user_id: created_by.id, user_id: created_by.id,
data: {}, data: { post_url: created_post.url }.to_json,
topic_id: created_post.topic_id, topic_id: created_post.topic_id,
post_number: created_post.post_number post_number: created_post.post_number
) )

View File

@ -38,6 +38,10 @@ class NotificationEmailer
enqueue :user_watching_first_post enqueue :user_watching_first_post
end end
def post_approved
enqueue :post_approved
end
def private_message def private_message
enqueue_private(:user_private_message) enqueue_private(:user_private_message)
end end
@ -52,16 +56,17 @@ class NotificationEmailer
def self.notification_params(notification, type) def self.notification_params(notification, type)
post_id = (notification.data_hash[:original_post_id] || notification.post_id).to_i post_id = (notification.data_hash[:original_post_id] || notification.post_id).to_i
notification_type = Notification.types[notification.notification_type]
hash = { hash = {
type: type, type: type,
user_id: notification.user_id, user_id: notification.user_id,
notification_id: notification.id, notification_id: notification.id,
notification_data_hash: notification.data_hash, notification_data_hash: notification.data_hash,
notification_type: Notification.types[notification.notification_type], notification_type: notification_type,
} }
hash[:post_id] = post_id if post_id > 0 hash[:post_id] = post_id if post_id > 0 && notification_type != :post_approved
hash hash
end end

View File

@ -3924,6 +3924,13 @@ en:
If this was not you, please [review your existing sessions](%{base_url}/my/preferences/account) and consider changing your password. If this was not you, please [review your existing sessions](%{base_url}/my/preferences/account) and consider changing your password.
post_approved:
title: "Your post was approved"
subject_template: "[%{site_name}] Your post was approved"
text_body_template: |
Hello,
This is an automated message from %{site_name} to let you know that [your post](%{base_url}%{post_url}) was approved.
page_forbidden: page_forbidden:
title: "Oops! That page is private." title: "Oops! That page is private."

View File

@ -80,6 +80,19 @@ describe UserNotifications do
end end
end end
describe '.post_approved' do
fab!(:post) { Fabricate(:post) }
it 'works' do
subject = UserNotifications.post_approved(user, { notification_data_hash: { post_url: post.url } })
expect(subject.to).to eq([user.email])
expect(subject.subject).to be_present
expect(subject.from).to eq([SiteSetting.notification_email])
expect(subject.body).to be_present
end
end
describe ".confirm_new_email" do describe ".confirm_new_email" do
let(:opts) do let(:opts) do
{ requested_by_admin: requested_by_admin, email_token: token } { requested_by_admin: requested_by_admin, email_token: token }

View File

@ -244,5 +244,14 @@ describe NotificationEmailer do
include_examples "enqueue_public" include_examples "enqueue_public"
end end
context 'post_approved' do
let(:no_delay) { no_delay }
let(:type) { :post_approved }
let(:delay) { SiteSetting.email_time_window_mins.minutes }
let!(:notification) { create_notification(:post_approved) }
include_examples "enqueue_public"
end
end end
end end