2023-10-06 17:12:00 +02:00
module Gestionnaires
class GroupeGestionnaireAdministrateursController < GestionnaireController
2023-12-06 14:41:32 +01:00
before_action :retrieve_groupe_gestionnaire
2023-10-06 17:12:00 +02:00
def index
end
def create
2024-05-15 23:16:55 +02:00
emails = [ params . require ( :administrateur ) [ :email ] ] . compact
emails = emails . map { EmailSanitizableConcern :: EmailSanitizer . sanitize ( _1 ) }
2023-12-06 14:41:32 +01:00
administrateurs_to_add , valid_emails , invalid_emails = Administrateur . find_all_by_identifier_with_emails ( emails : )
not_found_emails = valid_emails - administrateurs_to_add . map ( & :email )
# Send invitations to users without account
if not_found_emails . present?
administrateurs_to_add += not_found_emails . map do | email |
user = User . create_or_promote_to_administrateur ( email , SecureRandom . hex )
2024-03-19 17:17:44 +01:00
user . invite_administrateur!
2023-12-06 14:41:32 +01:00
user . administrateur
end
end
administrateurs_already_in_groupe_gestionnaire = [ ]
# We dont't want to assign a user to an groupe_gestionnaire if they are already assigned to it
administrateurs_duplicate = administrateurs_to_add & @groupe_gestionnaire . administrateurs
administrateurs_to_add -= @groupe_gestionnaire . administrateurs
administrateurs_to_add . each do | administrateur |
# We don't change administrateur.groupe_gestionnaire_id is administrateur already in another groupe_gestionnaire for which current_gestionnaire is not a gestionnaire or if current_gestionnaire is not a superAdmin
if ! current_gestionnaire . is_a? ( SuperAdmin ) &&
administrateur . groupe_gestionnaire_id &&
( ( administrateur . groupe_gestionnaire . ancestor_ids + [ administrateur . groupe_gestionnaire_id ] ) & current_gestionnaire . groupe_gestionnaire_ids ) . empty?
administrateurs_already_in_groupe_gestionnaire << administrateur
next
end
@groupe_gestionnaire . add_administrateur ( administrateur )
end
if administrateurs_already_in_groupe_gestionnaire . present?
flash [ :alert ] = I18n . t ( 'activerecord.errors.administrateurs_already_in_groupe_gestionnaire' ,
count : administrateurs_already_in_groupe_gestionnaire . size ,
emails : administrateurs_already_in_groupe_gestionnaire )
end
if invalid_emails . present?
flash [ :alert ] = I18n . t ( 'activerecord.wrong_address' ,
count : invalid_emails . size ,
emails : invalid_emails . join ( ', ' ) )
end
if administrateurs_duplicate . present?
flash [ :alert ] = I18n . t ( 'activerecord.errors.duplicate_email' ,
count : invalid_emails . size ,
emails : administrateurs_duplicate . map ( & :email ) . join ( ', ' ) )
end
if administrateurs_to_add . present?
flash [ :notice ] = I18n . t ( 'groupe_gestionnaires.flash.notice.groupe_gestionnaire_administrateur.create' )
GroupeGestionnaireMailer
. notify_added_administrateurs ( @groupe_gestionnaire , administrateurs_to_add , current_gestionnaire . email )
. deliver_later
end
@administrateur = administrateurs_to_add [ 0 ]
2023-10-06 17:12:00 +02:00
end
def destroy
2023-12-06 14:41:32 +01:00
@administrateur = Administrateur . find ( params [ :id ] )
if @groupe_gestionnaire . id != @administrateur . groupe_gestionnaire_id
flash [ :alert ] = I18n . t ( 'groupe_gestionnaires.flash.alert.groupe_gestionnaire_administrateur.not_in_groupe_gestionnaire' , email : @administrateur . email )
else
result = AdministrateurDeletionService . new ( current_gestionnaire , @administrateur ) . call
case result
in Dry :: Monads :: Result :: Success
logger . info ( " L'administrateur #{ @administrateur . id } est supprimé par le gestionnaire #{ current_gestionnaire . id } depuis le groupe gestionnaire #{ @groupe_gestionnaire . id } " )
flash [ :notice ] = I18n . t ( 'groupe_gestionnaires.flash.notice.groupe_gestionnaire_administrateur.destroy' , email : @administrateur . email )
GroupeGestionnaireMailer
. notify_removed_administrateur ( @groupe_gestionnaire , @administrateur . email , current_gestionnaire . email )
. deliver_later
in Dry :: Monads :: Result :: Failure ( reason )
flash [ :alert ] = I18n . t ( 'groupe_gestionnaires.flash.alert.groupe_gestionnaire_administrateur.cannot_be_deleted' , email : @administrateur . email )
end
end
end
def remove
@administrateur = Administrateur . find ( params [ :id ] )
if @groupe_gestionnaire . id != @administrateur . groupe_gestionnaire_id
flash [ :alert ] = I18n . t ( 'groupe_gestionnaires.flash.alert.groupe_gestionnaire_administrateur.not_in_groupe_gestionnaire' , email : @administrateur . email )
else
@administrateur . update ( groupe_gestionnaire_id : nil )
flash [ :notice ] = I18n . t ( 'groupe_gestionnaires.flash.notice.groupe_gestionnaire_administrateur.remove' , email : @administrateur . email )
GroupeGestionnaireMailer
. notify_removed_administrateur ( @groupe_gestionnaire , @administrateur . email , current_gestionnaire . email )
. deliver_later
end
2023-10-06 17:12:00 +02:00
end
end
end