summaryrefslogtreecommitdiff
path: root/app/presenters/packages/conan/package_presenter.rb
blob: df770777ad1291dd180eabf7833ab8b5a8eca6d8 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# frozen_string_literal: true

module Packages
  module Conan
    class PackagePresenter
      include API::Helpers::Packages::Conan::ApiHelpers
      include API::Helpers::RelatedResourcesHelpers
      include Gitlab::Utils::StrongMemoize

      attr_reader :params

      def initialize(package, user, project, params = {})
        @package = package
        @user = user
        @project = project
        @params = params
      end

      def recipe_urls
        map_package_files do |package_file|
          next unless package_file.conan_file_metadatum.recipe_file?

          options = url_options(package_file)
          recipe_file_url(options)
        end
      end

      def recipe_snapshot
        map_package_files do |package_file|
          package_file.file_md5 if package_file.conan_file_metadatum.recipe_file?
        end
      end

      def package_urls
        map_package_files do |package_file|
          next unless package_file.conan_file_metadatum.package_file? && matching_reference?(package_file)

          options = url_options(package_file).merge(
            conan_package_reference: package_file.conan_file_metadatum.conan_package_reference,
            package_revision: package_file.conan_file_metadatum.package_revision
          )

          package_file_url(options)
        end
      end

      def package_snapshot
        map_package_files do |package_file|
          next unless package_file.conan_file_metadatum.package_file? && matching_reference?(package_file)

          package_file.file_md5
        end
      end

      private

      def url_options(package_file)
        {
          package_name: @package.name,
          package_version: @package.version,
          package_username: @package.conan_metadatum.package_username,
          package_channel: @package.conan_metadatum.package_channel,
          file_name: package_file.file_name,
          recipe_revision: package_file.conan_file_metadatum.recipe_revision.presence || ::Packages::Conan::FileMetadatum::DEFAULT_RECIPE_REVISION
        }
      end

      def map_package_files
        package_files.to_a.map do |package_file|
          next unless package_file.conan_file_metadatum

          key = package_file.file_name
          value = yield(package_file)
          next unless key && value

          [key, value]
        end.compact.to_h
      end

      def package_files
        return unless @package

        @package_files ||= @package.package_files.preload_conan_file_metadata
      end

      def matching_reference?(package_file)
        package_file.conan_file_metadatum.conan_package_reference == conan_package_reference
      end

      def conan_package_reference
        params[:conan_package_reference]
      end
    end
  end
end