discourse/app/serializers/incoming_email_details_serializer.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

54 lines
1.3 KiB
Ruby

# frozen_string_literal: true
class IncomingEmailDetailsSerializer < ApplicationSerializer
attributes :error,
:error_description,
:rejection_message,
:headers,
:subject,
:body
def initialize(incoming_email, opts)
super
@error_string = incoming_email.error
@mail = Mail.new(incoming_email.raw)
end
EMAIL_RECEIVER_ERROR_PREFIX = "Email::Receiver::".freeze
def error
@error_string.presence || I18n.t("emails.incoming.unrecognized_error")
end
def error_description
error_name = @error_string.sub(EMAIL_RECEIVER_ERROR_PREFIX, "").underscore
I18n.t("emails.incoming.errors.#{error_name}")
end
def include_error_description?
@error_string && @error_string[EMAIL_RECEIVER_ERROR_PREFIX]
end
def headers
@mail.header.to_s
end
def subject
@mail.subject.presence || I18n.t("emails.incoming.no_subject")
end
def body
body = @mail.text_part.decoded rescue nil
body ||= @mail.html_part.decoded rescue nil
body ||= @mail.body.decoded rescue nil
return I18n.t("emails.incoming.no_body") if body.blank?
body.encode("utf-8", invalid: :replace, undef: :replace, replace: "")
.strip
.truncate_words(100, escape: false)
end
end