Desarrollo de plugins: ¿Se dispara un evento si cambia la dirección de correo electrónico?

Estoy trabajando en un plugin que añadirá usuarios a un grupo si su dirección de correo electrónico coincide con una lista blanca.

Lo tengo funcionando para usuarios nuevos con:

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

Lo que quiero hacer a continuación es mover a los usuarios al grupo si cambian su dirección a un dominio coincidente. Pensé que

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

lo solucionaría, pero no funciona. (Luego pensé que si cambiaban su dirección de correo electrónico y luego cambiaban cualquier otra cosa en su registro de usuario, funcionaría, ¡y así es!)

¿Hay algún evento que pueda llamar/observar (solo soy un cavernícola) que se active si cambia su dirección de correo electrónico?

Cuanto más lo pienso, más creo que no se dispare :user_updated al cambiar una dirección de correo electrónico parece un error. Antes de tener el modelo user_email, cambiar la dirección de correo electrónico disparaba :user_updated.

Pero tener UserEmail ` do

after_update :trigger_user_updated_event

y con

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

se dispara con más frecuencia de la debida (por ejemplo, al iniciar sesión mediante un enlace por correo electrónico) y también provoca un

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

Durante unos minutos, pensé que sabía algo. :crying_cat_face:

No es así porque son modelos diferentes, como ya descubriste. Desde que se fusionaron los cambios de @LeoMcA, User y UserEmail son modelos distintos, y cambiar una instancia de UserEmail no activará un observador en una instancia de User.

¿Podrías decirme la mejor manera de llamar a mi función conditionally_add_to_group cuando cambie la dirección de correo electrónico?

Creo que algo así en plugin.rb funcionará

after_initialize do

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

end

¡Alegría! ¡Funciona!

  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

¡Muchísimas gracias, @Falco!