Plugin-Entwicklung: Wird ein Event ausgelöst, wenn die E-Mail-Adresse geändert wird?

Ich arbeite an einem Plugin, das Benutzer einer Gruppe hinzufügt, wenn ihre E-Mail-Adresse auf einer Whitelist steht.

Es funktioniert bereits für neue Benutzer mit:

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

Als Nächstes möchte ich, dass Benutzer automatisch in die Gruppe verschoben werden, wenn sie ihre Adresse auf eine passende Domain ändern. Ich dachte, folgender Code würde funktionieren:

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

aber das tut er nicht. (Ich dachte dann, es würde funktionieren, wenn sie ihre E-Mail-Adresse ändern und danach noch etwas anderes im Benutzerdatensatz ändern – und das funktioniert tatsächlich!)

Gibt es ein Event, das ich aufrufen oder überwachen kann (ich bin nur ein Höhlenmensch), das feuert, wenn sich ihre E-Mail-Adresse ändert?

Je mehr ich darüber nachdenke, desto mehr scheint es mir ein Fehler zu sein, dass :user_updated nicht ausgelöst wird, wenn eine E-Mail-Adresse geändert wird. Vor der Einführung des user_email-Modells wurde :user_updated bei einer Änderung der E-Mail-Adresse ausgelöst.

Aber wenn UserEmail so definiert ist:

  do

    after_update :trigger_user_updated_event

und mit

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

wird es öfter ausgelöst als es sollte (z. B. beim Einloggen über einen E-Mail-Link) und verursacht zudem einen Fehler:

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

Für ein paar Minuten dachte ich, ich wüsste, was los ist. :crying_cat_face:

Es liegt nicht daran, dass es sich um ein anderes Modell handelt, wie du herausgefunden hast. Seit die Änderungen von @LeoMcA übernommen wurden, sind User und UserEmail separate Modelle, und das Ändern einer Instanz von UserEmail löst keinen Watcher in einer User-Instanz aus.

Können Sie mir sagen, wie ich die Funktion conditionally_add_to_group am besten aufrufen lasse, wenn sich die E-Mail-Adresse ändert?

Ich denke, so etwas in plugin.rb wird funktionieren

after_initialize do

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

end

Hurra! IT funktioniert!

  self.add_model_callback(UserEmail, :after_commit, on: :update) do
    puts "#{'-'*50}\nEMAIL JA ADRESSE WURDE AKTUALISIERT für #{self.user_id}!!!!\n#{'-'*50}\n"
    user = User.find(self.user_id)
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

Vielen Dank, @Falco!