demarches-normaliennes/app/models/commentaire.rb
2019-09-17 12:37:37 +02:00

83 lines
2.1 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class Commentaire < ApplicationRecord
self.ignored_columns = ['file', 'piece_justificative_id']
belongs_to :dossier, inverse_of: :commentaires, touch: true
belongs_to :user
belongs_to :instructeur
validate :messagerie_available?, on: :create
has_one_attached :piece_jointe
validates :body, presence: { message: "Votre message ne peut être vide" }
default_scope { order(created_at: :asc) }
scope :updated_since?, -> (date) { where('commentaires.updated_at > ?', date) }
after_create :notify
def email
if user
user.email
elsif instructeur
instructeur.email
else
read_attribute(:email)
end
end
def header
"#{redacted_email}, #{I18n.l(created_at, format: '%d %b %Y %H:%M')}"
end
def redacted_email
if instructeur.present?
instructeur.email.split('@').first
else
email
end
end
def sent_by_system?
[CONTACT_EMAIL, OLD_CONTACT_EMAIL].include?(email) &&
user.nil? && instructeur.nil?
end
def sent_by?(someone)
email == someone.email
end
def file_url
if piece_jointe.attached? && piece_jointe.virus_scanner.safe?
Rails.application.routes.url_helpers.url_for(piece_jointe)
end
end
private
def notify
dossier_user_email = dossier.user.email
invited_users_emails = dossier.invites.pluck(:email).to_a
# - If the email is the contact email, the commentaire is a copy
# of an automated notification email we sent to a user, so do nothing.
# - If a user or an invited user posted a commentaire, do nothing,
# the notification system will properly
# - Otherwise, a instructeur posted a commentaire, we need to notify the user
if !email.in?([CONTACT_EMAIL, dossier_user_email, *invited_users_emails])
notify_user
end
end
def notify_user
DossierMailer.notify_new_answer(dossier).deliver_later
end
def messagerie_available?
return if sent_by_system?
if dossier.present? && !dossier.messagerie_available?
errors.add(:dossier, "Il nest pas possible denvoyer un message sur un dossier archivé ou en brouillon")
end
end
end