Class: Packages::Package

Inherits:
ApplicationRecord show all
Includes:
EnumInheritance, Gitlab::SQL::Pattern, Gitlab::Utils::StrongMemoize, Downloadable, Installable, Sortable, UsageStatistics
Defined in:
app/models/packages/package.rb

Constant Summary collapse

DISPLAYABLE_STATUSES =
[:default, :error, :deprecated].freeze
INSTALLABLE_STATUSES =
[:default, :hidden, :deprecated].freeze
DETAILED_INFO_STATUSES =
[:default, :deprecated].freeze
STATUS_MESSAGE_MAX_LENGTH =
255

Constants included from Gitlab::SQL::Pattern

Gitlab::SQL::Pattern::MIN_CHARS_FOR_PARTIAL_MATCHING, Gitlab::SQL::Pattern::REGEX_QUOTED_TERM

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Constants included from HasCheckConstraints

HasCheckConstraints::NOT_NULL_CHECK_PATTERN

Constants included from ResetOnColumnErrors

ResetOnColumnErrors::MAX_RESET_PERIOD

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Downloadable

#touch_last_downloaded_at

Methods included from Gitlab::SQL::Pattern

split_query_to_search_terms

Methods inherited from ApplicationRecord

===, cached_column_list, #create_or_load_association, current_transaction, declarative_enum, default_select_columns, delete_all_returning, #deleted_from_database?, id_in, id_not_in, iid_in, nullable_column?, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, #to_ability_name, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order

Methods included from Organizations::Sharding

#sharding_organization

Methods included from ResetOnColumnErrors

#reset_on_union_error, #reset_on_unknown_attribute_error

Methods included from Gitlab::SensitiveSerializableHash

#serializable_hash

Class Method Details

.by_file_name_and_sha256(file_name, sha256) ⇒ Object



167
168
169
170
# File 'app/models/packages/package.rb', line 167

def self.by_file_name_and_sha256(file_name, sha256)
  joins(:package_files)
    .where(packages_package_files: { file_name: file_name, file_sha256: sha256 }).last!
end

.by_name_and_file_name(name, file_name) ⇒ Object



161
162
163
164
165
# File 'app/models/packages/package.rb', line 161

def self.by_name_and_file_name(name, file_name)
  with_name(name)
    .joins(:package_files)
    .where(packages_package_files: { file_name: file_name }).last!
end

.by_name_and_version!(name, version) ⇒ Object



172
173
174
# File 'app/models/packages/package.rb', line 172

def self.by_name_and_version!(name, version)
  find_by!(name: name, version: version)
end

.inheritance_columnObject



133
# File 'app/models/packages/package.rb', line 133

def self.inheritance_column = 'package_type'

.inheritance_column_to_class_mapObject



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'app/models/packages/package.rb', line 135

def self.inheritance_column_to_class_map
  {
    ml_model: 'Packages::MlModel::Package',
    golang: 'Packages::Go::Package',
    rubygems: 'Packages::Rubygems::Package',
    conan: 'Packages::Conan::Package',
    rpm: 'Packages::Rpm::Package',
    debian: 'Packages::Debian::Package',
    composer: 'Packages::Composer::Sti::Package',
    helm: 'Packages::Helm::Package',
    generic: 'Packages::Generic::Package',
    pypi: 'Packages::Pypi::Package',
    terraform_module: 'Packages::TerraformModule::Package',
    nuget: 'Packages::Nuget::Package',
    npm: 'Packages::Npm::Package',
    maven: 'Packages::Maven::Package',
    cargo: 'Packages::Cargo::Package'
  }.freeze
end

.installable_statusesObject



202
203
204
# File 'app/models/packages/package.rb', line 202

def self.installable_statuses
  INSTALLABLE_STATUSES
end

.package_type_to_class!(package_type) ⇒ Object



155
156
157
158
159
# File 'app/models/packages/package.rb', line 155

def self.package_type_to_class!(package_type)
  inheritance_column_to_class_map.fetch(package_type) do
    raise ArgumentError, "'#{package_type}' is not a valid package_type"
  end.constantize
end

.pluck_namesObject



176
177
178
# File 'app/models/packages/package.rb', line 176

def self.pluck_names
  pluck(:name)
end

.pluck_versionsObject



180
181
182
# File 'app/models/packages/package.rb', line 180

def self.pluck_versions
  pluck(:version)
end

.sort_by_attribute(method) ⇒ Object



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'app/models/packages/package.rb', line 184

def self.sort_by_attribute(method)
  case method.to_s
  when 'created_asc', 'created_at_asc' then order_created
  when 'name_asc' then order_name
  when 'name_desc' then order_name_desc
  when 'version_asc' then order_version
  when 'version_desc' then order_version_desc
  when 'type_asc' then order_type
  when 'type_desc' then order_type_desc
  when 'project_name_asc' then order_project_name
  when 'project_name_desc' then order_project_name_desc
  when 'project_path_asc' then order_project_path
  when 'project_path_desc' then order_project_path_desc
  else
    order_created_desc
  end
end

Instance Method Details

#create_build_infos!(build) ⇒ Object



238
239
240
241
242
243
# File 'app/models/packages/package.rb', line 238

def create_build_infos!(build)
  return unless build&.pipeline

  # TODO: use an upsert call when https://gitlab.com/gitlab-org/gitlab/-/issues/339093 is implemented
  build_infos.find_or_create_by!(pipeline: build.pipeline)
end

#detailed_info?Boolean

Returns:

  • (Boolean)


263
264
265
# File 'app/models/packages/package.rb', line 263

def detailed_info?
  DETAILED_INFO_STATUSES.include?(status.to_sym)
end

#last_build_infoObject

Technical debt: to be removed in gitlab.com/gitlab-org/gitlab/-/issues/281937



219
220
221
# File 'app/models/packages/package.rb', line 219

def last_build_info
  build_infos.last
end

#mark_package_files_for_destructionObject



245
246
247
248
249
# File 'app/models/packages/package.rb', line 245

def mark_package_files_for_destruction
  return unless pending_destruction?

  ::Packages::MarkPackageFilesForDestructionWorker.perform_async(id)
end

#package_settingsObject



233
234
235
# File 'app/models/packages/package.rb', line 233

def package_settings
  project.namespace.package_settings
end

#pipelineObject

Technical debt: to be removed in gitlab.com/gitlab-org/gitlab/-/issues/281937



225
226
227
# File 'app/models/packages/package.rb', line 225

def pipeline
  last_build_info&.pipeline
end

#publish_creation_eventObject



251
252
253
254
255
256
257
258
259
260
261
# File 'app/models/packages/package.rb', line 251

def publish_creation_event
  ::Gitlab::EventStore.publish(
    ::Packages::PackageCreatedEvent.new(data: {
      project_id: project_id,
      id: id,
      name: name,
      version: version,
      package_type: package_type
    })
  )
end

#tag_namesObject



229
230
231
# File 'app/models/packages/package.rb', line 229

def tag_names
  tags.pluck(:name)
end

#versionsObject



206
207
208
209
210
211
212
213
214
215
216
# File 'app/models/packages/package.rb', line 206

def versions
  self.class.inheritance_column_to_class_map[package_type.to_sym]
            .constantize
            .for_projects(project)
            .preload_pipelines
            .including_tags
            .displayable
            .with_name(name)
            .where.not(version: version)
            .order(:version)
end