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.
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.
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