Extract User::Confirmation concern

This commit is contained in:
Matt Jankowski 2024-11-12 11:20:09 -05:00
parent 891cccb815
commit 77ebb32f6a
2 changed files with 33 additions and 34 deletions

View file

@ -15,38 +15,4 @@ module User::Confirmation
def unconfirmed? def unconfirmed?
!confirmed? !confirmed?
end end
def confirm
wrap_email_confirmation do
super
end
end
# Mark current email as confirmed, bypassing Devise
def mark_email_as_confirmed!
wrap_email_confirmation do
skip_confirmation!
save!
end
end
private
def wrap_email_confirmation
new_user = !confirmed?
self.approved = true if grant_approval_on_confirmation?
yield
if new_user
# Handle race condition when approving and confirming user at the same time
reload unless approved?
if approved?
prepare_new_user!
else
notify_staff_about_pending_account!
end
end
end
end end

View file

@ -188,6 +188,20 @@ class User < ApplicationRecord
account_id account_id
end end
def confirm
wrap_email_confirmation do
super
end
end
# Mark current email as confirmed, bypassing Devise
def mark_email_as_confirmed!
wrap_email_confirmation do
skip_confirmation!
save!
end
end
def update_sign_in!(new_sign_in: false) def update_sign_in!(new_sign_in: false)
old_current = current_sign_in_at old_current = current_sign_in_at
new_current = Time.now.utc new_current = Time.now.utc
@ -401,6 +415,25 @@ class User < ApplicationRecord
open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval? open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval?
end end
def wrap_email_confirmation
new_user = !confirmed?
self.approved = true if grant_approval_on_confirmation?
yield
if new_user
# Avoid extremely unlikely race condition when approving and confirming
# the user at the same time
reload unless approved?
if approved?
prepare_new_user!
else
notify_staff_about_pending_account!
end
end
end
def sign_up_from_ip_requires_approval? def sign_up_from_ip_requires_approval?
sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.containing(sign_up_ip.to_s).exists? sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.containing(sign_up_ip.to_s).exists?
end end