Welcome to mirror list, hosted at ThFree Co, Russian Federation.

index_presenter.rb « helm « packages « presenters « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e85a4f248cfb38c3bdc40f7e2f78fe52443ec320 (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
# frozen_string_literal: true

module Packages
  module Helm
    class IndexPresenter
      include API::Helpers::RelatedResourcesHelpers

      API_VERSION = 'v1'
      CHANNEL = 'channel'
      INDEX_YAML_SUFFIX = "/#{CHANNEL}/index.yaml"
      EMPTY_HASH = {}.freeze

      def initialize(project_id_param, channel, packages)
        @project_id_param = project_id_param
        @channel = channel
        @packages = packages
      end

      def api_version
        API_VERSION
      end

      def entries
        return EMPTY_HASH unless @channel.present?

        result = Hash.new { |h, k| h[k] = [] }

        # this .each is safe as we have max 300 objects
        most_recent_package_files.each do |package_file|
          name = package_file.helm_metadata['name']
          result[name] << package_file.helm_metadata.merge({
            'created' => package_file.created_at.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ'),
            'digest' => package_file.file_sha256,
            'urls' => ["charts/#{package_file.file_name}"]
          })
        end

        result
      end

      def generated
        Time.zone.now.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
      end

      def server_info
        path = api_v4_projects_packages_helm_index_yaml_path(
          id: ERB::Util.url_encode(@project_id_param),
          channel: CHANNEL
        )
        {
          'contextPath' => path.delete_suffix(INDEX_YAML_SUFFIX)
        }
      end

      private

      def most_recent_package_files
        ::Packages::PackageFile.most_recent_for(
          @packages,
          extra_join: :helm_file_metadatum,
          extra_where: { packages_helm_file_metadata: { channel: @channel } }
        ).preload_helm_file_metadata
      end
    end
  end
end