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