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

88 lines
2.9 KiB
Ruby
Raw Normal View History

module Administrateurs
2021-04-02 16:00:32 +02:00
class ExpertsProceduresController < AdministrateurController
include EmailSanitizableConcern
before_action :retrieve_procedure
before_action :retrieve_experts_procedure, only: [:index, :create]
before_action :retrieve_experts_emails, only: [:index, :create]
2021-04-02 16:00:32 +02:00
def index
end
def create
email_checker = EmailChecker.new
2021-04-02 16:00:32 +02:00
emails = params['emails'].presence || [].to_json
emails = JSON.parse(emails).map { EmailSanitizer.sanitize(_1) }
@maybe_typo, emails = emails.map do |email|
result = email_checker.check(email: email)
if result[:email_suggestions].present?
[email, result[:email_suggestions].first]
else
[email, nil]
end
end.partition { _1[1].present? }
errors = if !@maybe_typo.empty?
["Attention, nous pensons avoir identifié une faute de frappe dans les invitations : #{@maybe_typo.map(&:first).join(', ')}"]
else
[]
end
emails += [EmailSanitizer.sanitize(params['maybe_typo'])] if params['maybe_typo'].present?
2021-04-02 16:00:32 +02:00
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
2021-04-02 16:00:32 +02:00
.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
2024-06-25 14:41:17 +02:00
flash.now[:notice] = t('.experts_assignment',
2021-04-02 16:00:32 +02:00
count: valid_users.count,
value: valid_users.map(&:email).join(', '),
procedure: @procedure.id)
end
2024-06-25 14:41:17 +02:00
flash.now[:alert] = errors.join(". ") if !errors.empty?
render :index
2021-04-02 16:00:32 +02:00
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])
2021-04-02 16:00:32 +02:00
expert_email = expert_procedure.expert.email
expert_procedure.update!(revoked_at: Time.zone.now)
2021-05-26 15:16:30 +02:00
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 }
2021-04-02 16:00:32 +02:00
end
def expert_procedure_params
params.require(:experts_procedure).permit(:allow_decision_access)
end
2021-04-02 16:00:32 +02:00
end
end