otwarchive-symphonyarchive/app/models/feedback.rb
2026-03-11 22:22:11 +00:00

91 lines
2.7 KiB
Ruby

# Class which holds feedback sent to the archive administrators about the archive as a whole
class Feedback < ApplicationRecord
attr_accessor :ip_address, :referer, :site_skin
# NOTE: this has NOTHING to do with the Comment class!
# This is just the name of the text field in the Feedback
# class which holds the user's comments.
validates_presence_of :comment
validates_presence_of :summary
validates_presence_of :language
validates :email, email_format: { allow_blank: false }
validates_length_of :summary, maximum: ArchiveConfig.FEEDBACK_SUMMARY_MAX,
too_long: ts("must be less than %{max} characters long.", max: ArchiveConfig.FEEDBACK_SUMMARY_MAX_DISPLAYED)
validate :check_for_spam
def check_for_spam
approved = logged_in_with_matching_email? || !Akismetor.spam?(akismet_attributes)
errors.add(:base, ts("This report looks like spam to our system!")) unless approved
end
def logged_in_with_matching_email?
User.current_user.present? && User.current_user.email == email
end
def akismet_attributes
# If the user is logged in and we're sending info to Akismet, we can assume
# the email does not match.
role = User.current_user.present? ? "user-with-nonmatching-email" : "guest"
{
comment_type: "contact-form",
key: ArchiveConfig.AKISMET_KEY,
blog: ArchiveConfig.AKISMET_NAME,
user_ip: ip_address,
user_agent: user_agent,
user_role: role,
comment_author_email: email,
comment_content: comment
}
end
def mark_as_spam!
# don't submit spam reports unless in production mode
Rails.env.production? && Akismetor.submit_spam(akismet_attributes)
end
def mark_as_ham!
# don't submit ham reports unless in production mode
Rails.env.production? && Akismetor.submit_ham(akismet_attributes)
end
def email_and_send
UserMailer.feedback(id).deliver_later
send_report
end
def rollout_string
string = ""
# ES UPGRADE TRANSITION #
# Remove ES version logic, but leave this method for future rollout use
# string << if Feedback.use_new_search?
# "ES 6.0"
# else
# "ES 0.90"
# end
end
def send_report
return unless zoho_enabled?
reporter = SupportReporter.new(
title: summary,
description: comment,
language: language,
email: email,
username: username,
user_agent: user_agent,
site_revision: ArchiveConfig.REVISION.to_s,
rollout: rollout,
ip_address: ip_address,
referer: referer,
site_skin: site_skin
)
reporter.send_report!
end
private
def zoho_enabled?
%w[staging production].include?(Rails.env)
end
end