mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-31 16:49:40 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class UserDataDeletion
 | |
|   def self.delete_team_data(team)
 | |
|     ActiveRecord::Base.logger = Logger.new(STDOUT)
 | |
|     team.transaction do
 | |
|       # Destroy tiny_mce_assets
 | |
|       if team.tiny_mce_assets.present?
 | |
|         team.tiny_mce_assets.each do |tiny_mce_asset|
 | |
|           tiny_mce_asset.image.purge
 | |
|           tiny_mce_asset.destroy!
 | |
|         end
 | |
|       end
 | |
|       team.repositories.each do |repository|
 | |
|         repository.repository_rows.find_each do |repository_row|
 | |
|           # Destroy repository_cell assets
 | |
|           repository_row
 | |
|             .repository_cells
 | |
|             .where(value_type: 'RepositoryAssetValue').each do |repository_cell|
 | |
|             repository_cell.value.asset.file.purge
 | |
|             repository_cell.value.asset.destroy!
 | |
|           end
 | |
|         end
 | |
|         repository.destroy
 | |
|       end
 | |
|       team.projects.each do |project|
 | |
|         project.reports.destroy_all
 | |
|         project.activities.destroy_all
 | |
|         project.experiments.each do |experiment|
 | |
|           experiment.my_modules.each do |my_module|
 | |
|             # Destroy result assets
 | |
|             my_module.results.each do |result|
 | |
|               result.result_table.delete if result.result_table.present?
 | |
|               result.table.delete if result.table.present?
 | |
|               next unless result.asset
 | |
| 
 | |
|               result.asset.file.purge
 | |
|               result.asset.destroy!
 | |
|             end
 | |
|             my_module.activities.destroy_all
 | |
|             my_module.inputs.destroy_all
 | |
|             my_module.outputs.destroy_all
 | |
|             my_module.results.destroy_all
 | |
|             my_module.my_module_tags.destroy_all
 | |
|             my_module.task_comments.destroy_all
 | |
|             my_module.my_module_repository_rows.destroy_all
 | |
|             my_module.user_my_modules.destroy_all
 | |
|             my_module.report_elements.destroy_all
 | |
|             my_module.protocols.each { |p| p.update(parent_id: nil) }
 | |
|             my_module.protocols.each do |protocol|
 | |
|               destroy_protocol(protocol)
 | |
|             end
 | |
|             my_module.user_assignments.destroy_all
 | |
|             my_module.delete
 | |
|           end
 | |
| 
 | |
|           # Destroy workflow image
 | |
|           experiment.workflowimg.purge
 | |
| 
 | |
|           experiment.activities.destroy_all
 | |
|           experiment.report_elements.destroy_all
 | |
|           experiment.my_module_groups.delete_all
 | |
|           experiment.user_assignments.destroy_all
 | |
|           experiment.delete
 | |
|         end
 | |
|         project.user_projects.destroy_all
 | |
|         project.tags.destroy_all
 | |
|         project.project_comments.destroy_all
 | |
|         project.report_elements.destroy_all
 | |
|         project.user_assignments.destroy_all
 | |
| 
 | |
|         project.delete
 | |
|       end
 | |
|       team.protocols.each { |p| p.update(parent_id: nil) }
 | |
|       team.protocols.where(my_module: nil).each do |protocol|
 | |
|         destroy_protocol(protocol)
 | |
|       end
 | |
|       team.protocol_keywords.destroy_all
 | |
|       User.where(current_team_id: team).each do |user|
 | |
|         user.update(current_team_id: nil)
 | |
|       end
 | |
|       team.reports.destroy_all
 | |
|       team.user_assignments.destroy_all
 | |
|       team.destroy!
 | |
|       # raise ActiveRecord::Rollback
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.destroy_protocol(protocol)
 | |
|     protocol.steps.each do |step|
 | |
|       # Destroy step assets
 | |
|       if step.assets.present?
 | |
|         step.assets.each do |asset|
 | |
|           asset.file.purge
 | |
|           asset.destroy!
 | |
|         end
 | |
|       end
 | |
|       # Destroy step
 | |
|       step.tables.destroy_all
 | |
|       step.step_tables.delete_all
 | |
|       step.step_texts.destroy_all
 | |
|       step.report_elements.destroy_all
 | |
|       step.step_comments.destroy_all
 | |
|       step.step_assets.destroy_all
 | |
|       step.checklists.destroy_all
 | |
|       step.assets.destroy_all
 | |
|       step.tiny_mce_assets.destroy_all
 | |
|       step.delete
 | |
|     end
 | |
|     # Destroy protocol
 | |
|     protocol.protocol_protocol_keywords.destroy_all
 | |
|     protocol.protocol_keywords.destroy_all
 | |
|     protocol.destroy
 | |
|   end
 | |
| 
 | |
|   def self.destroy_notifications(user)
 | |
|     # Find all notifications where user is the only reference
 | |
|     # on the notification, and destroy all such notifications
 | |
|     # (user_notifications are destroyed when notification is
 | |
|     # destroyed). We try to do this efficiently (hence in_groups_of).
 | |
|     nids_all = user.notifications.pluck(:id)
 | |
|     nids_all.in_groups_of(1000, false) do |nids|
 | |
|       Notification
 | |
|         .where(id: nids)
 | |
|         .joins(:user_notifications)
 | |
|         .group('notifications.id')
 | |
|         .having('count(notification_id) <= 1')
 | |
|         .destroy_all
 | |
|     end
 | |
|     # Now, simply destroy all user notification relations left
 | |
|     user.user_notifications.destroy_all
 | |
|   end
 | |
| end
 |