summaryrefslogtreecommitdiff
path: root/app/services/confirmation_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/confirmation_service.rb')
-rw-r--r--app/services/confirmation_service.rb31
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