summaryrefslogtreecommitdiff
path: root/app/services/packages/nuget/create_dependency_service.rb
blob: 62ab485c0fcffdec19033cf92bfb024ff926959f (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
# frozen_string_literal: true
module Packages
  module Nuget
    class CreateDependencyService < BaseService
      def initialize(package, dependencies = [])
        @package = package
        @dependencies = dependencies
      end

      def execute
        return if @dependencies.empty?

        @package.transaction do
          create_dependency_links
          create_dependency_link_metadata
        end
      end

      private

      def create_dependency_links
        ::Packages::CreateDependencyService
          .new(@package, dependencies_for_create_dependency_service)
          .execute
      end

      def create_dependency_link_metadata
        inserted_links = ::Packages::DependencyLink.preload_dependency
                                                   .for_package(@package)

        return if inserted_links.empty?

        rows = inserted_links.map do |dependency_link|
          raw_dependency = raw_dependency_for(dependency_link.dependency)

          next if raw_dependency[:target_framework].blank?

          {
            dependency_link_id: dependency_link.id,
            target_framework: raw_dependency[:target_framework]
          }
        end

        ::Gitlab::Database.bulk_insert(::Packages::Nuget::DependencyLinkMetadatum.table_name, rows.compact) # rubocop:disable Gitlab/BulkInsert
      end

      def raw_dependency_for(dependency)
        name = dependency.name
        version = dependency.version_pattern.presence

        @dependencies.find do |raw_dependency|
          raw_dependency[:name] == name && raw_dependency[:version] == version
        end
      end

      def dependencies_for_create_dependency_service
        names_and_versions = @dependencies.to_h do |dependency|
          [dependency[:name], version_or_empty_string(dependency[:version])]
        end

        { 'dependencies' => names_and_versions }
      end

      def version_or_empty_string(version)
        return '' if version.blank?

        version
      end
    end
  end
end