diff --git a/app/models/repository.rb b/app/models/repository.rb index 7d439aeba..dbcdde94a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -37,6 +37,7 @@ class Repository < RepositoryBase after_save :assign_globally_shared_inventories, if: -> { saved_change_to_permission_level? && globally_shared? } after_save :unassign_globally_shared_inventories, if: -> { saved_change_to_permission_level? && !globally_shared? } after_save :unassign_unshared_items, if: :saved_change_to_permission_level + after_save :unlink_unshared_items, if: -> { saved_change_to_permission_level? && !globally_shared? } validates :name, presence: true, @@ -249,6 +250,26 @@ class Repository < RepositoryBase .destroy_all end + def unlink_unshared_items + repository_rows_ids = repository_rows.select(:id) + rows_to_unlink = RepositoryRow.joins("LEFT JOIN repository_row_connections \ + ON repository_rows.id = repository_row_connections.parent_id \ + OR repository_rows.id = repository_row_connections.child_id") + .where("repository_row_connections.parent_id IN (?) \ + OR repository_row_connections.child_id IN (?)", + repository_rows_ids, + repository_rows_ids) + .joins(:repository) + .where.not(repositories: self) + .where.not(repositories: { team: team }) + .distinct + + RepositoryRowConnection.where(parent: repository_rows_ids, child: rows_to_unlink) + .destroy_all + RepositoryRowConnection.where(child: repository_rows_ids, parent: rows_to_unlink) + .destroy_all + end + private def sync_name_with_snapshots diff --git a/app/models/team_shared_object.rb b/app/models/team_shared_object.rb index ae54eae5e..e2e638a67 100644 --- a/app/models/team_shared_object.rb +++ b/app/models/team_shared_object.rb @@ -4,6 +4,7 @@ class TeamSharedObject < ApplicationRecord enum permission_level: Extends::SHARED_OBJECTS_PERMISSION_LEVELS.except(:not_shared) after_create :assign_shared_inventories, if: -> { shared_object.is_a?(Repository) } + before_destroy :unlink_unshared_items, if: -> { shared_object.is_a?(Repository) } before_destroy :unassign_unshared_items, if: -> { shared_object.is_a?(Repository) } before_destroy :unassign_unshared_inventories, if: -> { shared_object.is_a?(Repository) } @@ -55,4 +56,22 @@ class TeamSharedObject < ApplicationRecord def unassign_unshared_inventories team.repository_sharing_user_assignments.where(assignable: shared_object).find_each(&:destroy!) end + + def unlink_unshared_items + repository_rows_ids = shared_object.repository_rows.select(:id) + rows_to_unlink = RepositoryRow.joins("LEFT JOIN repository_row_connections \ + ON repository_rows.id = repository_row_connections.parent_id \ + OR repository_rows.id = repository_row_connections.child_id") + .where("repository_row_connections.parent_id IN (?) \ + OR repository_row_connections.child_id IN (?)", + repository_rows_ids, + repository_rows_ids) + .joins(:repository) + .where(repositories: { team: team }) + + RepositoryRowConnection.where(parent: rows_to_unlink, child: repository_rows_ids) + .destroy_all + RepositoryRowConnection.where(parent: repository_rows_ids, child: rows_to_unlink) + .destroy_all + end end