Add Rake task to GDPR delete users
This commit is contained in:

committed by
Dominic Sauer

parent
3bdbb02228
commit
a73bb8f0ea
78
lib/tasks/gdpr_delete.rake
Normal file
78
lib/tasks/gdpr_delete.rake
Normal file
@ -0,0 +1,78 @@
|
||||
# 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
|
Reference in New Issue
Block a user