summaryrefslogtreecommitdiff
path: root/app/models/packages/debian/file_metadatum.rb
blob: af51f256e18187895a483be8b9f50f71d8e631d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# frozen_string_literal: true

class Packages::Debian::FileMetadatum < ApplicationRecord
  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
  }

  validates :file_type, presence: true
  validates :file_type, inclusion: { in: %w[unknown] }, if: -> { package_file&.package&.debian_incoming? }
  validates :file_type,
    inclusion: { in: %w[source dsc deb udeb buildinfo changes] },
    if: -> { package_file&.package&.debian_package? }

  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?

  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?
  end

  def requires_component?
    source? || dsc? || requires_architecture? || buildinfo?
  end

  def requires_fields?
    dsc? || requires_architecture? || buildinfo? || changes?
  end
end