79 lines
2.5 KiB
Ruby
79 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
namespace :gdpr do
|
|
desc 'Deletes user accounts in accordance with GDPR. ' \
|
|
'Requires a text file with external user IDs (one per line) and ' \
|
|
'the corresponding consumer for deletion. Pass those via ' \
|
|
'TXT=/path/to/file.txt and CONSUMER=Name.'
|
|
task delete_users: :environment do
|
|
text_file_location = ENV.fetch('TXT')
|
|
consumer_name = ENV.fetch('CONSUMER')
|
|
|
|
if text_file_location.blank? || consumer_name.blank?
|
|
warn '--------------------------------------'
|
|
warn 'GDPR deletion tool to remove personal user data. USAGE:'
|
|
warn '--------------------------------------'
|
|
warn 'rake gdpr:delete_users TXT=./accounts.txt CONSUMER=openHPI'
|
|
exit 1
|
|
end
|
|
|
|
consumer = Consumer.where('lower(name) = ?', consumer_name.downcase).first
|
|
|
|
if consumer.blank?
|
|
warn '--------------------------------------'
|
|
warn "ERROR: The consumer '#{consumer_name}' was not found but is mandatory."
|
|
warn '--------------------------------------'
|
|
exit 2
|
|
end
|
|
|
|
user_ids = begin
|
|
File.readlines(text_file_location).map(&:strip).compact_blank
|
|
rescue SystemCallError => e
|
|
warn '--------------------------------------'
|
|
warn "ERROR: The file '#{text_file_location}' could not be opened: #{e.message}"
|
|
warn '--------------------------------------'
|
|
exit 3
|
|
end
|
|
|
|
unknown_user_ids = []
|
|
errored_user_ids = []
|
|
users_deleted = 0
|
|
|
|
user_ids.each do |user_id|
|
|
user = ExternalUser.find_by(external_id: user_id, consumer:)
|
|
if user.blank?
|
|
unknown_user_ids << user_id
|
|
next
|
|
end
|
|
|
|
if user.update(name: 'Deleted User', email: nil)
|
|
users_deleted += 1
|
|
else
|
|
errored_user_ids << user_id
|
|
end
|
|
end
|
|
|
|
if unknown_user_ids.any?
|
|
warn '--------------------------------------'
|
|
warn 'WARNING: Some user IDs were not found:'
|
|
warn '--------------------------------------'
|
|
unknown_user_ids.each do |user_id|
|
|
warn user_id
|
|
end
|
|
end
|
|
|
|
if errored_user_ids.any?
|
|
warn '--------------------------------------'
|
|
warn 'WARNING: Some user IDs were found but were not processed successfully:'
|
|
warn '--------------------------------------'
|
|
errored_user_ids.each do |user_id|
|
|
warn user_id
|
|
end
|
|
end
|
|
|
|
puts '--------------------------------------'
|
|
puts "SUCCESS: #{users_deleted} user(s) deleted."
|
|
puts '--------------------------------------'
|
|
end
|
|
end
|