diff --git a/app/builders/messages/forwarded_message_builder.rb b/app/builders/messages/forwarded_message_builder.rb index ca3da3f86..76212d786 100644 --- a/app/builders/messages/forwarded_message_builder.rb +++ b/app/builders/messages/forwarded_message_builder.rb @@ -6,58 +6,66 @@ class Messages::ForwardedMessageBuilder def perform return {} unless @message_id - return basic_attributes unless forwarded_message && email_data.present? + return basic_attributes unless valid_forwarded_data? build_forwarded_attributes end def formatted_content(original_content = '') - return original_content unless forwarded_message && email_data.present? + return original_content.to_s unless valid_forwarded_data? - original_content = original_content.to_s - original_content + forwarded_header_text + forwarded_body_text + original_content.to_s + forwarded_header_text + forwarded_body_text end def formatted_html_content(original_content = '') - return original_content unless forwarded_message && email_data.present? + return original_content unless valid_forwarded_data? html_content = convert_markdown_to_html(original_content) - - # Ensure valid HTML structure even with empty content - return "
#{forwarded_header_html}#{forwarded_body_html}
" if html_content.blank? - - "
#{html_content}

#{forwarded_header_html}#{forwarded_body_html}
" + html_wrapper(html_content) end def forwarded_email_data(original_content = '') - return {} unless forwarded_message && email_data.present? - - original_plain = strip_markdown(original_content.to_s) - full_content = formatted_content(original_content) + return {} unless valid_forwarded_data? data = prepare_email_data + full_content = formatted_content(original_content) - # HTML content - ensure quoted section is always included even if empty - data['html_content']['quoted'] = original_plain - data['html_content']['reply'] = full_content - data['html_content']['full'] = formatted_html_content(original_content) + data['html_content'].merge!({ + 'quoted' => strip_markdown(original_content.to_s), + 'reply' => full_content, + 'full' => formatted_html_content(original_content) + }) - # Text content - ensure quoted section is always included even if empty - data['text_content']['quoted'] = original_content.to_s - data['text_content']['reply'] = full_content - data['text_content']['full'] = full_content + data['text_content'].merge!({ + 'quoted' => original_content.to_s, + 'reply' => full_content, + 'full' => full_content + }) data end private + def valid_forwarded_data? + forwarded_message && email_data.present? + end + + def html_wrapper(content) + base = '
' + + if content.blank? + "#{base}#{forwarded_header_html}#{forwarded_body_html}
" + else + "#{base}#{content}

#{forwarded_header_html}#{forwarded_body_html}" + end + end + def build_forwarded_attributes { content_attributes: { forwarded_message_id: @message_id, email: prepare_email_data - # forwarded_info: formatted_info, } } end @@ -73,21 +81,27 @@ class Messages::ForwardedMessageBuilder end def forwarded_body_text - if email_data.dig('text_content', 'full').present? - email_data.dig('text_content', 'full') - elsif email_data.dig('html_content', 'full').present? - ActionView::Base.full_sanitizer.sanitize(email_data.dig('html_content', 'full')) + text_content = email_data.dig('text_content', 'full') + html_content = email_data.dig('html_content', 'full') + + if text_content.present? + text_content + elsif html_content.present? + ActionView::Base.full_sanitizer.sanitize(html_content) else forwarded_message.content.to_s end end def forwarded_header_html + email = extract_email(formatted_info[:from]) + name = formatted_info[:from].split(' <').first + [ '
', '
---------- Forwarded message ---------
', - "From: #{formatted_info[:from].split(' <').first} ", - "<#{extract_email(formatted_info[:from])}>
", + "From: #{name} ", + "<#{email}>
", "Date: #{formatted_info[:date]}
", "Subject: #{formatted_info[:subject]}
", "To: <#{formatted_info[:to]}>
", @@ -121,22 +135,18 @@ class Messages::ForwardedMessageBuilder def convert_markdown_to_html(text) return '' if text.blank? - # Basic markdown conversion html = text.to_s - # Convert *text* to text - html = html.gsub(/\*\*?(.*?)\*\*?/) { |m| m.start_with?('**') ? "#{::Regexp.last_match(1)}" : "#{::Regexp.last_match(1)}" } - # Convert _text_ to text + html = html.gsub(/\*\*?(.*?)\*\*?/) do |m| + m.start_with?('**') ? "#{::Regexp.last_match(1)}" : "#{::Regexp.last_match(1)}" + end + html.gsub(/_(.*?)_/, '\1') end def extract_email(from_field) return '' if from_field.blank? - if from_field =~ /<(.*)>/ - ::Regexp.last_match(1) - else - from_field - end + from_field =~ /<(.*)>/ ? ::Regexp.last_match(1) : from_field end def forwarded_message @@ -153,18 +163,13 @@ class Messages::ForwardedMessageBuilder def formatted_info { - from: format_from_field, - date: format_date_field, + from: parse_from_field(extract_from_field), + date: format_date_string(email_data['date'] || ''), subject: email_data['subject'] || '', to: email_data['to']&.first || '' } end - def format_from_field - from_field = extract_from_field - parse_from_field(from_field) - end - def extract_from_field email_data['from']&.first.to_s end @@ -173,40 +178,20 @@ class Messages::ForwardedMessageBuilder return '' if from_field.blank? if from_field =~ /(.*)<(.*)>/ - name = ::Regexp.last_match(1).strip - email = ::Regexp.last_match(2).strip - "#{name} <#{email}>" + "#{::Regexp.last_match(1).strip} <#{::Regexp.last_match(2).strip}>" else from_field end end - def format_date_field - date_str = extract_date_string - format_date_string(date_str) - end - - def extract_date_string - email_data['date'] || '' - end - def format_date_string(date_str) return '' if date_str.blank? - parsed_date = parse_date(date_str) - - if parsed_date + begin + parsed_date = DateTime.parse(date_str) parsed_date.strftime('%a, %b %d, %Y at %l:%M %p') - else + rescue StandardError date_str end end - - def parse_date(date_str) - return nil if date_str.blank? - - DateTime.parse(date_str) - rescue StandardError - nil - end end