Développement de plugin : un événement est-il déclenché si l'adresse e-mail est modifiée ?

Je travaille sur un plugin qui ajoutera les utilisateurs à un groupe si leur adresse e-mail correspond à une liste blanche.

Cela fonctionne pour les nouveaux utilisateurs avec :

  DiscourseEvent.on(:user_created) do |user|
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

Ce que je veux faire ensuite, c’est déplacer les utilisateurs vers le groupe s’ils modifient leur adresse pour un domaine correspondant. Je pensais que :

  DiscourseEvent.on(:user_updated) do |user|
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

ferait l’affaire, mais ce n’est pas le cas. (Ensuite, j’ai pensé que si ils changeaient leur adresse e-mail puis modifiaient autre chose dans leur enregistrement utilisateur, cela fonctionnerait, et c’est le cas !)

Y a-t-il un événement que je peux appeler/surveiller (je suis juste un homme des cavernes) qui se déclenchera si leur adresse e-mail est modifiée ?

Plus j’y réfléchis, plus je pense que le fait que :user_updated ne soit pas déclenché lors d’une modification de l’adresse e-mail semble être un bug. Avant que nous ayons un modèle user_email, la modification de l’adresse e-mail déclenchait :user_updated.

Mais avoir UserEmail ` do

after_update :trigger_user_updated_event

et avec

  def trigger_user_updated_event
    user = User.find(self.user_id)
    DiscourseEvent.trigger(:user_updated, user)
    true
  end

entraîne un déclenchement plus fréquent que prévu (par exemple lors de la connexion via un lien e-mail) et provoque également une erreur :

PG::UniqueViolation - ERROR:  duplicate key value violates unique constraint "index_group_users_on_group_id_and_user_id"

Pendant quelques minutes, j’ai cru savoir quelque chose. :crying_cat_face:

Ce n’est pas le cas car il s’agit d’un modèle différent, comme vous l’avez constaté. Depuis que les modifications de @LeoMcA ont été fusionnées, User et UserEmail sont des modèles distincts, et la modification d’une instance de UserEmail ne déclenchera pas de watcher sur une instance de User.

Pouvez-vous m’indiquer la meilleure façon de déclencher la fonction conditionally_add_to_group lorsque l’adresse e-mail change ?

Je pense que quelque chose comme ceci dans plugin.rb fera l’affaire

after_initialize do

  add_model_callback(UserEmail, :after_commit, on: :update) do
     # Group.add blablabla
  end

end

Hourra ! Ça marche !

  self.add_model_callback(UserEmail, :after_commit, on: :update) do
    puts "#{'-'*50}\nEMAIL YES ADDRESS IS UPDATED for #{self.user_id}!!!!\n#{'-'*50}\n"
    user = User.find(self.user_id)
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

Merci mille fois, @Falco !