Skip to content

Commit

Permalink
Migrate anonymization script to react
Browse files Browse the repository at this point in the history
  • Loading branch information
danieljames-dj committed Jan 26, 2025
1 parent 92de2b5 commit 854423d
Show file tree
Hide file tree
Showing 20 changed files with 437 additions and 452 deletions.
36 changes: 0 additions & 36 deletions app/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -382,42 +382,6 @@ def leader_senior_voters
Competition.includes(associations).find_by_id!(params[:competition_id])
end

def anonymize_person
session[:anonymize_params] = {}
session[:anonymize_step] = nil
@anonymize_person = AnonymizePerson.new(session[:anonymize_params])
@anonymize_person.current_step = session[:anonymize_step]
end

def do_anonymize_person
session[:anonymize_params].deep_merge!((params[:anonymize_person]).permit(:person_wca_id)) if params[:anonymize_person]
@anonymize_person = AnonymizePerson.new(session[:anonymize_params])
@anonymize_person.current_step = session[:anonymize_step]

if @anonymize_person.valid?

if params[:back_button]
@anonymize_person.previous_step!
elsif @anonymize_person.last_step?
do_anonymize_person_response = @anonymize_person.do_anonymize_person

if do_anonymize_person_response && !do_anonymize_person_response[:error] && do_anonymize_person_response[:new_wca_id]
flash.now[:success] = "Successfully anonymized #{@anonymize_person.person_wca_id} to #{do_anonymize_person_response[:new_wca_id]}! Don't forget to run Compute Auxiliary Data and Export Public."
@anonymize_person = AnonymizePerson.new
else
flash.now[:danger] = do_anonymize_person_response[:error] || "Error anonymizing"
end

else
@anonymize_person.next_step!
end

session[:anonymize_step] = @anonymize_person.current_step
end

render 'anonymize_person'
end

def finish_unfinished_persons
@finish_persons = FinishPersonsForm.new(
competition_ids: params[:competition_ids] || nil,
Expand Down
163 changes: 163 additions & 0 deletions app/controllers/tickets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,167 @@ def edit_person_validators

render json: { dob: dob_validation_issues }
end

private def user_details(user)
return nil if user.nil?
{
email: user.email,
dob: user.dob,
is_currently_banned: user.banned?,
banned_in_past: user.banned_in_past?,
}
end

private def person_details(person)
return nil if person.nil?
{
dob: person.dob,
record_count: person.records,
championship_podiums: person.championship_podiums,
}
end

private def get_user_and_person(user_id, wca_id)
if user_id && !wca_id
user = User.find(user_id)
person = user.person
elsif !user_id && wca_id
person = Person.find_by(wca_id: wca_id)
user = person.user
elsif user_id && wca_id
person = Person.find_by(wca_id: wca_id)
user = User.find(user_id)
end
[user, person]
end

private def check_errors(user, person, user_id)
if user.present? && person.present? && user_id.present? && person.user.id != user_id
render status: :unprocessable_entity, json: {
error: "User ID connected with WCA ID is not the user ID provided.",
}
return true
end

if user.nil? && person.nil?
render status: :unprocessable_entity, json: {
error: "User ID and WCA ID is not provided."
}
return true
end
return false
end

def details_before_anonymization
user_id = params[:userId]
wca_id = params[:wcaId]

user, person = get_user_and_person(user_id, wca_id)
return if check_errors(user, person, user_id)

render json: {
user_details: user_details(user),
person_details: person_details(person),
}
end

def anonymize
user_id = params[:userId]
wca_id = params[:wcaId]

user, person = get_user_and_person(user_id, wca_id)
return if check_errors(user, person, user_id)

if user&.banned?
return render status: :unprocessable_entity, json: {
error: "Error anonymizing: This person is currently banned and cannot be anonymized."
}
end

if person.present?
wca_id_year = wca_id[0..3]
semi_id, = FinishUnfinishedPersons.compute_semi_id(wca_id_year, User::ANONYMOUS_NAME)
new_wca_id, = FinishUnfinishedPersons.complete_wca_id(semi_id)

if new_wca_id.nil?
return render status: :internal_server_error, json: {
error: "Error anonymizing: SubIds " + wca_id_year + "ANON00 to " + wca_id_year + "ANON99 are already taken."
}
end
end

if user.present? && person.present?
users_to_anonymize = User.where(id: user.id).or(User.where(unconfirmed_wca_id: person.wca_id))
elsif user.present? && person.nil?
users_to_anonymize = User.where(id: user.id)
elsif user.nil? && person.present?
users_to_anonymize = User.where(unconfirmed_wca_id: person.wca_id)
end

ActiveRecord::Base.transaction do
if person.present?
# Anonymize person's data in Results
person.results.update_all(personId: new_wca_id, personName: User::ANONYMOUS_NAME)

# Anonymize person's data in Persons
if person.sub_ids.length > 1
# if an updated person is due to a name change, this will delete the previous person.
# if an updated person is due to a country change, this will keep the sub person with an appropriate subId
previous_persons = Person.where(wca_id: wca_id).where.not(subId: 1).order(:subId)
current_sub_id = 1
current_country_id = person.countryId

previous_persons.each do |p|
if p.countryId == current_country_id
p.delete
else
current_sub_id += 1
current_country_id = p.countryId
p.update(
wca_id: new_wca_id,
name: User::ANONYMOUS_NAME,
gender: User::ANONYMOUS_GENDER,
dob: User::ANONYMOUS_DOB,
subId: current_sub_id
)
end
end
end
# Anonymize person's data in Persons for subid 1
person.update(
wca_id: new_wca_id,
name: User::ANONYMOUS_NAME,
gender: User::ANONYMOUS_GENDER,
dob: User::ANONYMOUS_DOB
)
end

unless users_to_anonymize.nil?
# If the account associated with the WCA ID is a special account (delegate, organizer, team member) then we want to keep the link between the Person and the account
if user.present? && user.is_special_account?
users_to_anonymize.update_all(wca_id: new_wca_id, avatar: nil)
else
users_to_anonymize.update_all(wca_id: nil, country_iso2: User::ANONYMOUS_COUNTRY_ISO2)
end

users_to_anonymize.each do |user_to_anonymize|
user_to_anonymize.update(
email: user_to_anonymize.id.to_s + User::ANONYMOUS_ACCOUNT_EMAIL_ID_SUFFIX,
name: User::ANONYMOUS_NAME,
unconfirmed_wca_id: nil,
delegate_id_to_handle_wca_id_claim: nil,
dob: User::ANONYMOUS_DOB,
gender: User::ANONYMOUS_GENDER,
current_sign_in_ip: nil,
last_sign_in_ip: nil
)
end
end
end

render json: {
success: true,
new_wca_id: new_wca_id,
}
end
end
21 changes: 0 additions & 21 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ class UsersController < ApplicationController
before_action :authenticate_user!, except: [:select_nearby_delegate, :acknowledge_cookies]
before_action :check_recent_authentication!, only: [:enable_2fa, :disable_2fa, :regenerate_2fa_backup_codes]
before_action :set_recent_authentication!, only: [:edit, :update, :enable_2fa, :disable_2fa]
before_action -> { redirect_to_root_unless_user(:can_admin_results?) }, only: [:anonymize]

RECENT_AUTHENTICATION_DURATION = 10.minutes.freeze

Expand Down Expand Up @@ -374,24 +373,4 @@ def acknowledge_cookies
end
true
end

def anonymize
user_id = params.require(:id)
user = User.find(user_id)

user_update_success = user.update(
email: user_id.to_s + User::ANONYMOUS_ACCOUNT_EMAIL_ID_SUFFIX,
name: User::ANONYMOUS_ACCOUNT_NAME,
wca_id: nil,
unconfirmed_wca_id: nil,
delegate_id_to_handle_wca_id_claim: nil,
dob: User::ANONYMOUS_ACCOUNT_DOB,
gender: User::ANONYMOUS_ACCOUNT_GENDER,
country_iso2: User::ANONYMOUS_ACCOUNT_COUNTRY_ISO2,
current_sign_in_ip: nil,
last_sign_in_ip: nil,
)

render json: { success: user_update_success }
end
end
120 changes: 0 additions & 120 deletions app/models/anonymize_person.rb

This file was deleted.

10 changes: 4 additions & 6 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ class User < ApplicationRecord
}

ANONYMOUS_ACCOUNT_EMAIL_ID_SUFFIX = '@worldcubeassociation.org'
ANONYMOUS_ACCOUNT_NAME = 'Anonymous'
ANONYMOUS_ACCOUNT_DOB = '1954-12-04'
ANONYMOUS_ACCOUNT_GENDER = 'o'
ANONYMOUS_ACCOUNT_COUNTRY_ISO2 = 'US'
ANONYMOUS_NAME = 'Anonymous'
ANONYMOUS_DOB = '1954-12-04'
ANONYMOUS_GENDER = 'o'
ANONYMOUS_COUNTRY_ISO2 = 'US'

def self.eligible_voters
[
Expand Down Expand Up @@ -656,7 +656,6 @@ def self.panel_pages
:generateDataExports,
:fixResults,
:mergeProfiles,
:anonymizePerson,
:reassignConnectedWcaId,
].index_with { |panel_page| panel_page.to_s.underscore.dasherize }
end
Expand Down Expand Up @@ -717,7 +716,6 @@ def self.panel_list
panel_pages[:generateDataExports],
panel_pages[:fixResults],
panel_pages[:mergeProfiles],
panel_pages[:anonymizePerson],
panel_pages[:reassignConnectedWcaId],
],
},
Expand Down
Loading

0 comments on commit 854423d

Please sign in to comment.