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