demarches-normaliennes/app/controllers/contact_controller.rb
2024-11-19 17:21:52 +01:00

89 lines
2.5 KiB
Ruby

# frozen_string_literal: true
class ContactController < ApplicationController
invisible_captcha only: [:create], on_spam: :redirect_to_root
before_action :reject_invalid_attachment, only: [:create]
def index
@form = ContactForm.new(tags: contact_form_params.fetch(:tags, []), dossier_id: dossier&.id)
@form.user = current_user
end
def admin
@form = ContactForm.new(tags: contact_form_params.fetch(:tags, []), for_admin: true)
@form.user = current_user
end
def create
if direct_message?
create_commentaire!
flash.notice = t('.direct_message_sent')
redirect_to messagerie_dossier_path(dossier)
return
end
@form = ContactForm.new(contact_form_params)
@form.user = current_user
if @form.save
@form.create_conversation_later
flash.notice = t('.message_sent')
redirect_to root_path
else
flash.alert = @form.errors.full_messages
render @form.for_admin ? :admin : :index
end
end
private
def create_commentaire!
attributes = {
piece_jointe: contact_form_params[:piece_jointe],
body: "[#{contact_form_params[:subject]}]<br><br>#{contact_form_params[:text]}"
}
CommentaireService.create!(current_user, dossier, attributes)
end
def browser_name
if browser.known?
"#{browser.name} #{browser.version} (#{browser.platform.name})"
end
end
def direct_message?
return false unless user_signed_in?
return false unless contact_form_params[:question_type] == ContactForm::TYPE_INSTRUCTION
dossier&.messagerie_available?
end
def dossier
@dossier ||= current_user&.dossiers&.find_by(id: contact_form_params[:dossier_id])
end
def redirect_to_root
redirect_to root_path, alert: t('invisible_captcha.sentence_for_humans')
end
def contact_form_params
keys = [:email, :subject, :text, :question_type, :dossier_id, :piece_jointe, :phone, :for_admin, tags: []]
if params.key?(:contact_form) # submitting form
params.require(:contact_form).permit(*keys)
else
params.permit(:dossier_id, tags: []) # prefilling form
end
end
def reject_invalid_attachment
piece_jointe = params.dig(:contact_form, :piece_jointe)
return if piece_jointe.nil?
return if piece_jointe.is_a?(ActionDispatch::Http::UploadedFile)
@form = ContactForm.new(user: current_user)
flash.alert = t('invalid_piece_jointe', scope: "contact.create")
render(@form.for_admin ? :admin : :index, status: :unprocessable_entity)
end
end