scinote-web/app/models/repository_snapshot.rb
2024-08-27 14:21:02 +02:00

95 lines
3.4 KiB
Ruby

# frozen_string_literal: true
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
belongs_to :original_repository,
foreign_key: :parent_id,
class_name: 'Repository',
inverse_of: :repository_snapshots,
optional: true
belongs_to :my_module, optional: true, touch: true
has_one :repository_stock_consumption_column,
-> { where(data_type: 'RepositoryStockConsumptionValue') },
class_name: 'RepositoryColumn',
foreign_key: :repository_id,
inverse_of: :repository_snapshot,
dependent: :destroy
validates :name, presence: true, length: { maximum: Constants::NAME_MAX_LENGTH }
validates :status, presence: true
validate :only_one_selected_for_my_module, if: ->(obj) { obj.changed.include? 'selected' }
scope :of_unassigned_from_project, lambda { |project|
joins(my_module: { experiment: :project })
.where(my_modules: { experiments: { project: project } })
.left_outer_joins(:original_repository)
.where.not(original_repository: Repository.assigned_to_project(project))
.select('DISTINCT ON ("repositories"."parent_id") "repositories".*')
.order(:parent_id, updated_at: :desc)
}
scope :assigned_to_project, lambda { |project|
where(team: project.team)
.joins(my_module: { experiment: :project })
.where(my_module: { experiments: { project: project } })
}
scope :readable_by_user, lambda { |user|
where(my_module_id: MyModule.readable_by_user(user).select(:id))
}
def self.create_preliminary!(repository, my_module, created_by = nil)
created_by ||= repository.created_by
create!(
name: repository.name,
original_repository: repository,
team: my_module.experiment.project.team,
status: :provisioning,
my_module:,
created_by:
)
end
def default_table_state
Constants::REPOSITORY_SNAPSHOT_TABLE_DEFAULT_STATE
end
def assigned_rows(my_module)
return RepositoryRow.none if my_module != self.my_module
repository_rows
end
def default_search_fileds
['repository_rows.name', "('#{RepositoryRow::ID_PREFIX}' || repository_rows.parent_id)", 'users.full_name']
end
private
def only_one_selected_for_my_module
return unless selected
if my_module.repository_snapshots.where(original_repository: original_repository, selected: true).any?
errors.add(:selected, I18n.t('activerecord.errors.models.repository_snapshot.attributes.selected.already_taken'))
end
end
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
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
end
end