debian-mirror-gitlab/app/models/packages/debian/file_metadatum.rb
2023-06-20 00:43:36 +05:30

69 lines
2 KiB
Ruby

# frozen_string_literal: true
module Packages
module Debian
class FileMetadatum < ApplicationRecord
include UpdatedAtFilterable
self.primary_key = :package_file_id
belongs_to :package_file, inverse_of: :debian_file_metadatum
validates :package_file, presence: true
validate :valid_debian_package_type
enum file_type: {
unknown: 1, source: 2, dsc: 3, deb: 4, udeb: 5, buildinfo: 6, changes: 7, ddeb: 8
}
validates :file_type, presence: true
validates :file_type, inclusion: { in: %w[unknown] },
if: -> { package_file&.package&.debian_incoming? || package_file&.package&.processing? }
validates :file_type,
inclusion: { in: %w[source dsc deb udeb buildinfo changes ddeb] },
if: -> { package_file&.package&.debian_package? && !package_file&.package&.processing? }
validates :component,
presence: true,
format: { with: Gitlab::Regex.debian_component_regex },
if: :requires_component?
validates :component, absence: true, unless: :requires_component?
validates :architecture,
presence: true,
format: { with: Gitlab::Regex.debian_architecture_regex },
if: :requires_architecture?
validates :architecture, absence: true, unless: :requires_architecture?
validates :fields,
presence: true,
json_schema: { filename: "debian_fields" },
if: :requires_fields?
validates :fields, absence: true, unless: :requires_fields?
scope :with_file_type, ->(file_type) do
where(file_type: file_type)
end
private
def valid_debian_package_type
return if package_file&.package&.debian?
errors.add(:package_file, _('Package type must be Debian'))
end
def requires_architecture?
deb? || udeb? || ddeb?
end
def requires_component?
source? || dsc? || requires_architecture? || buildinfo?
end
def requires_fields?
dsc? || requires_architecture? || buildinfo? || changes?
end
end
end
end