discourse/lib/system_message.rb
David Battersby 17e6ea96ab
UX: add preview to email templates (#36657)
Adds a preview text to the beginning of the email body based on user
notification type. The value is taken from the translation key, which
can be customized for each email within Admin -> Appearance -> Site
Texts (ie. translation overrides).

For html emails this preview text is hidden with `display: none` to
prevent it appearing within the body of the email. For the plain text
version of the email it will appear within the body of the email.

Co-authored-by: Martin Brennan <martin@discourse.org>
2026-01-08 11:33:53 +04:00

112 lines
3 KiB
Ruby

# frozen_string_literal: true
# Handle sending a message to a user from the system.
class SystemMessage
def self.create(recipient, type, params = {})
self.new(recipient).create(type, params)
end
def self.create_from_system_user(recipient, type, params = {})
params = params.merge(from_system: true)
self.new(recipient).create(type, params)
end
def initialize(recipient)
@recipient = recipient
end
def create(type, params = {})
method_params = params.dup
from_system = params.delete(:from_system)
target_group_names = params.delete(:target_group_names)
params = defaults.merge(params)
if I18n.exists?("system_messages.#{type}.preview", @recipient.effective_locale)
params[:email_preview] = I18n.t("system_messages.#{type}.preview", params)
end
title =
params[:message_title] ||
I18n.with_locale(@recipient.effective_locale) do
I18n.t("system_messages.#{type}.subject_template", params)
end
raw =
params[:message_raw] ||
I18n.with_locale(@recipient.effective_locale) do
I18n.t("system_messages.#{type}.text_body_template", params)
end
if from_system
user = Discourse.system_user
else
user = Discourse.site_contact_user
target_group_names =
(
if Group.exists?(name: SiteSetting.site_contact_group_name)
SiteSetting.site_contact_group_name
else
nil
end
)
end
post_creator_args = [
user,
title: title,
raw: raw,
archetype: Archetype.private_message,
target_usernames: @recipient.username,
target_group_names: target_group_names,
subtype: TopicSubtype.system_message,
skip_validations: true,
post_alert_options: params[:post_alert_options],
]
DiscourseEvent.trigger(
:before_system_message_sent,
message_type: type,
recipient: @recipient,
post_creator_args: post_creator_args,
params: method_params,
)
creator = PostCreator.new(*post_creator_args)
post = I18n.with_locale(@recipient.effective_locale) { creator.create }
DiscourseEvent.trigger(
:system_message_sent,
post: post,
message_type: type,
recipient: @recipient,
)
raise StandardError, creator.errors.full_messages.join(" ") if creator.errors.present?
unless from_system
UserArchivedMessage.create!(user: Discourse.site_contact_user, topic: post.topic)
end
post
end
def defaults
{
site_name: SiteSetting.title,
username: @recipient.username,
name: @recipient.name,
name_or_username: @recipient.name.presence || @recipient.username,
user_preferences_url: "#{@recipient.full_url}/preferences",
new_user_tips:
I18n.with_locale(@recipient.effective_locale) do
I18n.t("system_messages.usage_tips.text_body_template", base_url: Discourse.base_url)
end,
site_password: "",
base_url: Discourse.base_url,
email_preview: "",
}
end
end