diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index b0c1dea55..fe54d7129 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -123,9 +123,11 @@ module ReportsHelper end def assign_repository_or_snapshot(my_module, element_id, snapshot, repository) - original_repository = Repository.find_by(id: element_id) if element_id - repository ||= snapshot - repository || my_module.active_snapshot_or_live(original_repository) || original_repository + if element_id + repository = my_module.repositories.find_by(id: element_id) + repository ||= my_module.repository_snapshots.find_by(id: element_id) + end + repository || snapshot end def step_status_label(step) diff --git a/app/models/my_module.rb b/app/models/my_module.rb index 867c20dce..e7b3de028 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -53,6 +53,7 @@ class MyModule < ApplicationRecord has_many :my_module_repository_rows, inverse_of: :my_module, dependent: :destroy has_many :repository_rows, through: :my_module_repository_rows + has_many :repositories, -> { group(:id) }, through: :repository_rows has_many :repository_snapshots, dependent: :destroy, inverse_of: :my_module @@ -226,32 +227,15 @@ class MyModule < ApplicationRecord (live_repositories + selected_snapshots).sort_by { |r| r.name.downcase } end - def active_snapshot_or_live(rep_or_snap, exclude_snpashot_ids: []) - return unless rep_or_snap - - parent_id = rep_or_snap.is_a?(Repository) ? rep_or_snap.id : rep_or_snap.parent_id - - selected_snapshot_for_repo(parent_id, exclude_snpashot_ids: exclude_snpashot_ids) || - assigned_repositories&.where(id: parent_id)&.first || - repository_snapshots - .where(parent_id: parent_id) - .where.not(id: exclude_snpashot_ids) - .order(updated_at: :desc).first - end - - def update_report_repository_references(rep_or_snap) - ids = if rep_or_snap.is_a?(Repository) - RepositorySnapshot.where(parent_id: rep_or_snap.id).pluck(:id) + def update_report_repository_references(repository) + ids = if repository.is_a?(Repository) + RepositorySnapshot.where(parent_id: repository.id).pluck(:id) else - Repository.where(id: rep_or_snap.parent_id).pluck(:id) + - RepositorySnapshot.where(parent_id: rep_or_snap.parent_id).pluck(:id) + Repository.where(id: repository.parent_id).pluck(:id) + + RepositorySnapshot.where(parent_id: repository.parent_id).pluck(:id) end - report_elements.where(repository_id: ids).update(repository_id: rep_or_snap.id) - end - - def selected_snapshot_for_repo(repository_id, exclude_snpashot_ids: []) - repository_snapshots.where(parent_id: repository_id).where.not(id: exclude_snpashot_ids).where(selected: true).first + report_elements.where(repository_id: ids).update(repository: repository) end def unassigned_users diff --git a/app/models/repository.rb b/app/models/repository.rb index 76e36d5f9..0c384c802 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -15,6 +15,7 @@ class Repository < RepositoryBase inverse_of: :original_repository before_save :sync_name_with_snapshots, if: :name_changed? + before_destroy :refresh_report_references_on_destroy, prepend: true validates :name, presence: true, @@ -215,4 +216,15 @@ class Repository < RepositoryBase def sync_name_with_snapshots repository_snapshots.update(name: name) end + + def refresh_report_references_on_destroy + report_elements.find_each do |report_element| + repository_snapshot = report_element.my_module + .repository_snapshots + .where(original_repository: self) + .order(:selected, created_at: :desc) + .first + report_element.update(repository: repository_snapshot) if repository_snapshot + end + end end diff --git a/app/models/repository_snapshot.rb b/app/models/repository_snapshot.rb index d7383a557..df45e7eac 100644 --- a/app/models/repository_snapshot.rb +++ b/app/models/repository_snapshot.rb @@ -3,7 +3,7 @@ class RepositorySnapshot < RepositoryBase enum status: { provisioning: 0, ready: 1, failed: 2 } after_save :refresh_report_references, if: :saved_change_to_selected - before_destroy :refresh_report_references_for_destroy, prepend: true + before_destroy :refresh_report_references_on_destroy, prepend: true belongs_to :original_repository, foreign_key: :parent_id, class_name: 'Repository', @@ -44,19 +44,17 @@ class RepositorySnapshot < RepositoryBase def refresh_report_references if selected - ids = Repository.where(id: parent_id).pluck(:id) + - RepositorySnapshot.where(parent_id: parent_id).pluck(:id) - - ReportElement.where(my_module: my_module).where(repository_id: ids).update(repository_id: id) - elsif original_repository && !my_module.selected_snapshot_for_repo(original_repository.id) + repositories = RepositoryBase.where(id: parent_id).or(RepositoryBase.where(parent_id: parent_id)) + my_module.report_elements.where(repository: repositories).update(repository: self) + elsif original_repository my_module.update_report_repository_references(original_repository) end end - def refresh_report_references_for_destroy - repository_or_snap = original_repository || self - default_view_candidate = - my_module.active_snapshot_or_live(repository_or_snap, exclude_snpashot_ids: [id]) - my_module.update_report_repository_references(default_view_candidate) if default_view_candidate + def refresh_report_references_on_destroy + return my_module.update_report_repository_references(original_repository) if original_repository + + repository_snapshot = my_module.repository_snapshots.where(parent_id: parent_id).order(created_at: :desc).first + my_module.update_report_repository_references(repository_snapshot) if repository_snapshot end end