demarches-normaliennes/app/controllers/administrateurs/experts_procedures_controller.rb

91 lines
3.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.

module Administrateurs
class ExpertsProceduresController < AdministrateurController
include EmailSanitizableConcern
before_action :retrieve_procedure
before_action :retrieve_experts_procedure, only: [:index]
before_action :retrieve_experts_emails, only: [:index]
def index
end
def create
emails = params['emails'].presence || [].to_json
emails = JSON.parse(emails).map { EmailSanitizer.sanitize(_1) }
@maybe_typos, no_suggestions = emails
.map { |email| [email, EmailChecker.check(email:)[:suggestions]&.first] }
.partition { _1[1].present? }
errors = Array.wrap(generate_emails_suggestions_message(@maybe_typos))
emails = no_suggestions.map(&:first)
emails << EmailSanitizer.sanitize(params['final_email']) if params['final_email'].present?
valid_users, invalid_users = emails
.map { |email| User.create_or_promote_to_expert(email, SecureRandom.hex) }
.partition(&:valid?)
if invalid_users.any?
errors += invalid_users
.filter { |user| user.errors.present? }
.map { |user| "#{user.email} : #{user.errors.full_messages_for(:email).join(', ')}" }
end
if valid_users.present?
valid_users.each do |user|
experts_procedure = ExpertsProcedure.find_or_create_by(expert: user.expert, procedure: @procedure)
if !experts_procedure.revoked_at.nil?
experts_procedure.update!(revoked_at: nil)
end
end
flash.now[:notice] = t('.experts_assignment',
count: valid_users.count,
value: valid_users.map(&:email).join(', '),
procedure: @procedure.id)
end
flash.now[:alert] = errors.join(". ") if !errors.empty?
retrieve_experts_procedure
retrieve_experts_emails
render :index
end
def update
@procedure
.experts_procedures
.find(params[:id])
.update!(expert_procedure_params)
end
def destroy
expert_procedure = ExpertsProcedure.find_by!(procedure: @procedure, id: params[:id])
expert_email = expert_procedure.expert.email
expert_procedure.update!(revoked_at: Time.zone.now)
flash[:notice] = "#{expert_email} a été révoqué de la démarche et ne pourra plus déposer davis."
redirect_to admin_procedure_experts_path(@procedure)
end
private
def retrieve_experts_procedure
@experts_procedure ||= @procedure.experts_procedures.where(revoked_at: nil).sort_by { _1.expert.email }
end
def retrieve_experts_emails
@experts_emails ||= @experts_procedure.map { _1.expert.email }
end
def expert_procedure_params
params.require(:experts_procedure).permit(:allow_decision_access)
end
def generate_emails_suggestions_message(suggestions)
return if suggestions.empty?
typo_list = suggestions.map(&:first).join(', ')
verification_link = view_context.link_to("vérifier lorthographe", "#maybe_typos_errors")
"Attention, nous pensons avoir identifié une faute de frappe dans les invitations : #{typo_list}. Veuillez #{verification_link} des invitations."
end
end
end