1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
5 class SysController < ApplicationController
6 skip_before_action :find_object_by_uuid
7 skip_before_action :render_404_if_no_object
8 before_action :admin_required
12 # Sweep trashed collections
14 where('delete_at is not null and delete_at < statement_timestamp()').
18 where('is_trashed = false and trash_at < statement_timestamp()').
20 update_all('is_trashed = true')
22 # Want to make sure the #update_trash hook on the Group class
23 # runs. It does a couple of important things:
25 # - For projects, puts all the subprojects in the trashed_groups table.
27 # - For role groups, outbound permissions are deleted.
29 where("is_trashed = false and trash_at < statement_timestamp()").each do |grp|
34 # Sweep groups and their contents that are ready to be deleted
36 where('delete_at is not null and delete_at < statement_timestamp()').each do |group|
37 delete_project_and_contents(group.uuid)
40 # Sweep expired tokens
41 ActiveRecord::Base.connection.execute("DELETE from api_client_authorizations where expires_at <= statement_timestamp()")
48 def delete_project_and_contents(p_uuid)
49 p = Group.find_by_uuid(p_uuid)
51 raise "can't sweep group '#{p_uuid}', it may not exist"
53 if p.group_class == 'project'
54 # First delete sub projects and owned filter groups
55 Group.where({owner_uuid: p_uuid}).each do |sub_project|
56 delete_project_and_contents(sub_project.uuid)
58 # Next, iterate over all tables which have owner_uuid fields, with some
59 # exceptions, and delete records owned by this project
60 skipped_classes = ['Group', 'User']
61 ActiveRecord::Base.descendants.reject(&:abstract_class?).each do |klass|
62 if !skipped_classes.include?(klass.name) && klass.columns.collect(&:name).include?('owner_uuid')
63 klass.where({owner_uuid: p_uuid}).in_batches(of: 15).destroy_all
67 # Finally delete the group itself