From 8ed8f148a38aa7fa5cb5299f2c725ed2282fcc1f Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin Date: Wed, 27 May 2020 10:39:44 +0200 Subject: [PATCH] Revert "Fix handling of deleted repositories in reports [SCI-4698]" --- app/helpers/reports_helper.rb | 8 +++----- app/models/my_module.rb | 30 +++++++++++++++++++++++------- app/models/repository.rb | 12 ------------ app/models/repository_snapshot.rb | 20 +++++++++++--------- 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index fe54d7129..b0c1dea55 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -123,11 +123,9 @@ module ReportsHelper end def assign_repository_or_snapshot(my_module, element_id, snapshot, 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 + original_repository = Repository.find_by(id: element_id) if element_id + repository ||= snapshot + repository || my_module.active_snapshot_or_live(original_repository) || original_repository end def step_status_label(step) diff --git a/app/models/my_module.rb b/app/models/my_module.rb index e7b3de028..867c20dce 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -53,7 +53,6 @@ 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 @@ -227,15 +226,32 @@ class MyModule < ApplicationRecord (live_repositories + selected_snapshots).sort_by { |r| r.name.downcase } end - def update_report_repository_references(repository) - ids = if repository.is_a?(Repository) - RepositorySnapshot.where(parent_id: repository.id).pluck(:id) + 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) else - Repository.where(id: repository.parent_id).pluck(:id) + - RepositorySnapshot.where(parent_id: repository.parent_id).pluck(:id) + Repository.where(id: rep_or_snap.parent_id).pluck(:id) + + RepositorySnapshot.where(parent_id: rep_or_snap.parent_id).pluck(:id) end - report_elements.where(repository_id: ids).update(repository: repository) + 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 end def unassigned_users diff --git a/app/models/repository.rb b/app/models/repository.rb index 0c384c802..76e36d5f9 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -15,7 +15,6 @@ 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, @@ -216,15 +215,4 @@ 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 df45e7eac..d7383a557 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_on_destroy, prepend: true + before_destroy :refresh_report_references_for_destroy, prepend: true belongs_to :original_repository, foreign_key: :parent_id, class_name: 'Repository', @@ -44,17 +44,19 @@ class RepositorySnapshot < RepositoryBase def refresh_report_references if selected - 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 + 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) my_module.update_report_repository_references(original_repository) end end - 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 + 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 end end