summaryrefslogtreecommitdiff
path: root/app/presenters/packages/nuget/service_index_presenter.rb
blob: 033a1845c1ce6dd5f5e7a257cc063620d695e25b (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# frozen_string_literal: true

module Packages
  module Nuget
    class ServiceIndexPresenter
      include API::Helpers::RelatedResourcesHelpers

      SERVICE_VERSIONS = {
        download: %w[PackageBaseAddress/3.0.0],
        search: %w[SearchQueryService SearchQueryService/3.0.0-beta SearchQueryService/3.0.0-rc],
        symbol: %w[SymbolPackagePublish/4.9.0],
        publish: %w[PackagePublish/2.0.0],
        metadata: %w[RegistrationsBaseUrl RegistrationsBaseUrl/3.0.0-beta RegistrationsBaseUrl/3.0.0-rc]
      }.freeze

      SERVICE_COMMENTS = {
        download: 'Get package content (.nupkg).',
        search: 'Filter and search for packages by keyword.',
        symbol: 'Push symbol packages.',
        publish: 'Push and delete (or unlist) packages.',
        metadata: 'Get package metadata.'
      }.freeze

      VERSION = '3.0.0'

      PROJECT_LEVEL_SERVICES = %i[download publish symbol].freeze
      GROUP_LEVEL_SERVICES = %i[search metadata].freeze

      def initialize(project_or_group)
        @project_or_group = project_or_group
      end

      def version
        VERSION
      end

      def resources
        available_services.map { |service| build_service(service) }
                          .flatten
      end

      private

      def available_services
        case scope
        when :group
          GROUP_LEVEL_SERVICES
        when :project
          (GROUP_LEVEL_SERVICES + PROJECT_LEVEL_SERVICES).flatten
        end
      end

      def build_service(service_type)
        url = build_service_url(service_type)
        comment = SERVICE_COMMENTS[service_type]

        SERVICE_VERSIONS[service_type].map do |version|
          { :@id => url, :@type => version, :comment => comment }
        end
      end

      def build_service_url(service_type)
        full_path = case service_type
                    when :download
                      download_service_url
                    when :search
                      search_service_url
                    when :symbol
                      symbol_service_url
                    when :metadata
                      metadata_service_url
                    when :publish
                      publish_service_url
                    end

        expose_url(full_path)
      end

      def scope
        return :project if @project_or_group.is_a?(::Project)
        return :group if @project_or_group.is_a?(::Group)
      end

      def download_service_url
        params = {
          id: @project_or_group.id,
          package_name: nil,
          package_version: nil,
          package_filename: nil
        }

        api_v4_projects_packages_nuget_download_package_name_package_version_package_filename_path(
          params,
          true
        )
      end

      def metadata_service_url
        params = {
          id: @project_or_group.id,
          package_name: nil,
          package_version: nil
        }

        case scope
        when :group
          api_v4_groups___packages_nuget_metadata_package_name_package_version_path(
            params,
            true
          )
        when :project
          api_v4_projects_packages_nuget_metadata_package_name_package_version_path(
            params,
            true
          )
        end
      end

      def search_service_url
        case scope
        when :group
          api_v4_groups___packages_nuget_query_path(id: @project_or_group.id)
        when :project
          api_v4_projects_packages_nuget_query_path(id: @project_or_group.id)
        end
      end

      def publish_service_url
        api_v4_projects_packages_nuget_path(id: @project_or_group.id)
      end

      def symbol_service_url
        api_v4_projects_packages_nuget_symbolpackage_path(id: @project_or_group.id)
      end
    end
  end
end