summaryrefslogtreecommitdiff
path: root/lib/gitlab/phabricator_import/project_creator.rb
blob: b37a5b4498098500f83cd0f6f483f09d2d6a82ed (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
# frozen_string_literal: true

module Gitlab
  module PhabricatorImport
    class ProjectCreator
      def initialize(current_user, params)
        @current_user = current_user
        @params = params.dup
      end

      def execute
        return unless import_url.present? && api_token.present?

        project = Projects::CreateService.new(current_user, create_params).execute
        return project unless project.persisted?

        project.project_feature.update!(project_feature_attributes)

        project
      end

      private

      attr_reader :current_user, :params

      def create_params
        {
          name: project_name,
          path: project_path,
          namespace_id: namespace_id,
          import_type: 'phabricator',
          import_url: Project::UNKNOWN_IMPORT_URL,
          import_data: import_data
        }
      end

      def project_name
        params[:name]
      end

      def project_path
        params[:path]
      end

      def namespace_id
        params[:namespace_id] || current_user.namespace_id
      end

      def import_url
        params[:phabricator_server_url]
      end

      def api_token
        params[:api_token]
      end

      def project_feature_attributes
        @project_features_attributes ||= begin
                                           # everything disabled except for issues
                                           ProjectFeature::FEATURES.map do |feature|
                                             [ProjectFeature.access_level_attribute(feature), ProjectFeature::DISABLED]
                                           end.to_h.merge(ProjectFeature.access_level_attribute(:issues) => ProjectFeature::ENABLED)
                                         end
      end

      def import_data
        {
          data: {
            phabricator_url: import_url
          },
          credentials: {
            api_token: params.fetch(:api_token)
          }
        }
      end
    end
  end
end