diff --git a/app/jobs/handle_email_signin_job.rb b/app/jobs/handle_email_signin_job.rb index 4f111f4..0f45b32 100644 --- a/app/jobs/handle_email_signin_job.rb +++ b/app/jobs/handle_email_signin_job.rb @@ -5,7 +5,7 @@ class HandleEmailSigninJob < ApplicationJob email_address = ActiveRecord::Base.transaction do EmailAddress.find_by(email: email) || begin user = User.create! - user.email_addresses.create!(email: email, source: :direct) + user.email_addresses.create!(email: email, source: :signing_in) end end diff --git a/app/jobs/one_time/backfill_email_sources_job.rb b/app/jobs/one_time/backfill_email_sources_job.rb new file mode 100644 index 0000000..c953950 --- /dev/null +++ b/app/jobs/one_time/backfill_email_sources_job.rb @@ -0,0 +1,38 @@ +class OneTime::BackfillEmailSourcesJob < ApplicationJob + queue_as :default + + def perform + # Backfill email addresses from Slack + + users.find_each do |user| + slack_user_info = user.raw_slack_user_info + github_user_info = user.raw_github_user_info + sleep 1 + + user.email_addresses.where(source: nil).each do |email_address| + puts "Checking #{email_address.email} for #{user.id}" + if slack_user_info&.dig("user", "profile", "email") == email_address.email + email_address.update!(source: :slack) + puts "Updated #{email_address.email} for #{user.id} to slack" + elsif github_user_info&.dig("email") == email_address.email + email_address.update!(source: :github) + puts "Updated #{email_address.email} for #{user.id} to github" + end + end + + other_addresses = user.email_addresses.where(source: nil) + if other_addresses.any? + puts "Updating #{other_addresses.count} email addresses for #{user.id} to direct" + other_addresses.update_all(source: :signing_in) + end + end + end + + private + + def users + # any user with email addresses that don't have a source + @users ||= User.includes(:email_addresses) + .where(email_addresses: { source: nil }) + end +end diff --git a/app/models/email_address.rb b/app/models/email_address.rb index 5c383c9..551a752 100644 --- a/app/models/email_address.rb +++ b/app/models/email_address.rb @@ -6,7 +6,7 @@ class EmailAddress < ApplicationRecord format: { with: URI::MailTo::EMAIL_REGEXP } enum :source, { - direct: 0, + signing_in: 0, github: 1, slack: 2 }, prefix: true diff --git a/app/models/user.rb b/app/models/user.rb index 65efa60..446ffe2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -96,6 +96,16 @@ class User < ApplicationRecord update!(is_admin: false) end + def raw_github_user_info + return nil unless github_uid.present? + return nil unless github_access_token.present? + + @github_user_info ||= HTTP.auth("Bearer #{github_access_token}") + .get("https://api.github.com/user") + + JSON.parse(@github_user_info.body.to_s) + end + def raw_slack_user_info return nil unless slack_uid.present? return nil unless slack_access_token.present? diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 18c2b14..3d02633 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -91,7 +91,14 @@ <% if @user.email_addresses.any? %>