Sviluppo plugin: viene generato un evento se l'indirizzo email viene modificato?

Sto lavorando a un plugin che aggiungerà gli utenti a un gruppo se il loro indirizzo email corrisponde a un whitelist.

Funziona per gli utenti nuovi con:

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

Quello che voglio fare ora è spostare gli utenti nel gruppo se cambiano il loro indirizzo in un dominio corrispondente. Pensavo che

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

sarebbe bastato, ma non funziona. (Poi ho pensato che se cambiavano l’indirizzo email e poi modificavano qualsiasi altra cosa nel loro record utente, avrebbe funzionato, ed è così!)

Esiste qualche evento che posso chiamare/osservare (sono solo un cavernicolo) che si attivi se viene modificato il loro indirizzo email?

Più ci penso, più mi sembra che il fatto che :user_updated non venga attivato quando si cambia l’indirizzo email sia un bug. Prima di avere il modello user_email, cambiare l’indirizzo email attivava :user_updated.

Ma avere UserEmail ` do

after_update :trigger_user_updated_event

e con

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

attiva l’evento più spesso del dovuto (ad esempio quando si accede tramite un link email) e causa anche un

PG::UniqueViolation - ERRORE:  il valore della chiave duplicata viola il vincolo unico "index_group_users_on_group_id_and_user_id"

Per alcuni minuti, ho pensato di aver capito qualcosa. :crying_cat_face:

Non è così perché si tratta di un modello diverso, come hai scoperto. Da quando le modifiche di @LeoMcA sono state unite, User e UserEmail sono modelli separati, e la modifica di un’istanza di UserEmail non attiverà un watcher su un’istanza di User.

Puoi dirmi qual è il modo migliore per far sì che la funzione conditionally_add_to_group venga chiamata quando cambia l’indirizzo email?

Credo che qualcosa del genere in plugin.rb vada bene

after_initialize do

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

end

Evviva! Funziona!

  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

Grazie mille, @Falco!