hackatime/app/services/anonymize_user_service.rb
Mahad Kalam 667d3a7c93
WakaTime/Hackatime v1 imports + Settings v2 (#1062)
* Imports are back!!

* Settings UI v3

* Use Inertia forms for heartbeat imports

* Update app/javascript/pages/Users/Settings/Data.svelte

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update Bundle

* Fix broken Form/Button markup in Data.svelte settings page

* Update JS deps

* Greptile fixes

* Remove dead code

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-03-12 21:27:10 +00:00

77 lines
1.9 KiB
Ruby

class AnonymizeUserService
def self.call(user)
new(user).call
end
def initialize(user)
@user = user
end
def call
ActiveRecord::Base.transaction do
preserve_emails_for_ban_tracking
anonymize_user_data
destroy_associated_records
end
rescue StandardError => e
Sentry.capture_exception(e, extra: { user_id: user.id })
Rails.logger.error "AnonymizeUserService failed for user #{user.id}: #{e.message}"
raise
end
private
attr_reader :user
def preserve_emails_for_ban_tracking
user.email_addresses.update_all(
user_id: user.id,
source: EmailAddress.sources[:preserved_for_deletion]
)
end
def anonymize_user_data
user.update!(
slack_uid: nil,
slack_username: nil,
slack_avatar_url: nil,
slack_access_token: nil,
slack_scopes: [],
github_uid: nil,
github_username: nil,
github_avatar_url: nil,
github_access_token: nil,
hca_id: nil,
hca_access_token: nil,
hca_scopes: [],
username: "deleted_user_#{user.id}",
uses_slack_status: false,
country_code: nil,
deprecated_name: nil,
display_name_override: nil,
profile_bio: nil,
profile_github_url: nil,
profile_twitter_url: nil,
profile_bluesky_url: nil,
profile_linkedin_url: nil,
profile_discord_url: nil,
profile_website_url: nil
)
end
def destroy_associated_records
user.api_keys.destroy_all
user.admin_api_keys.destroy_all
user.sign_in_tokens.destroy_all
user.email_verification_requests.destroy_all
user.heartbeat_import_runs.destroy_all
user.project_repo_mappings.destroy_all
user.goals.destroy_all
# tombstone
Heartbeat.unscoped.where(user_id: user.id, deleted_at: nil).update_all(deleted_at: Time.current)
user.access_grants.destroy_all
user.access_tokens.destroy_all
end
end