diff options
Diffstat (limited to 'app/services/confirmation_service.rb')
-rw-r--r-- | app/services/confirmation_service.rb | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/app/services/confirmation_service.rb b/app/services/confirmation_service.rb new file mode 100644 index 00000000000..7a1b2db35a5 --- /dev/null +++ b/app/services/confirmation_service.rb @@ -0,0 +1,31 @@ +# Users and Emails can contain unconfirmed duplicates. When one is confirmed, +# remove any duplicates (don't remove duplicate User emails, just leave unconfirmed) +class ConfirmationService + + def initialize(resource_class, confirmation_token) + @resource_class, @confirmation_token = resource_class, confirmation_token + end + + def execute + resource = @resource_class.find_first_by_auth_conditions(confirmation_token: @confirmation_token) + if resource + email = resource.email + + # verify email being confirmed is not already confirmed elsewhere + unless Email.confirmed.exists?(email: email) || User.confirmed.exists?(email: email) + resource = @resource_class.confirm_by_token(@confirmation_token) + if resource.errors.empty? + # remove any duplicate emails from the emails table + Email.unconfirmed.where(email: email).each do |email| + email.destroy + end + + # nothing to do about the duplicate user emails, just leave unconfirmed + end + else + resource.errors.add(:base, 'This email address was confirmed by someone else') + end + end + resource + end +end |