Implement unlinking on inventory unsharing [SCI-9714] (#6736)

This commit is contained in:
Soufiane 2023-12-11 13:52:50 +01:00 committed by GitHub
parent dceb92021a
commit 00092b8059
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 0 deletions

View file

@ -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

View file

@ -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